c语言数字的拆解_C语言解决变态推理题
有兩個數,a和b。a大于等于b,而且二者都是2到99之間的正整數。
現在我當著P和Q的面,分別悄悄告訴了P先生a和b的和,告訴了Q先生a和b的積。
接下來有這么一段對話:
Q:我不知道a和b分別是啥。
P:我知道你不知道,我也不知道。
Q:那我現在知道了。
P:那我現在也知道了。
請問a和b分別是什么?
這幾天偶然看到這題,我不禁想到我高中時被這個問題支配一個晚上的恐懼,現在有了計算機,我們試試用計算機解決該問題。
現在我們首先要從這簡單的對話得到一些消息。第一句話,Q說不知道a,b是什么,說明了a和b不都為質數,若都為質數則ab有唯一的分解。第二句話,說明P知道a+b不能表示為兩個質數相加得到,不然如果能表示,那么P就不能肯定Q不知道a和b。第三句話,Q得到第二句話的消息后,對ab所有的乘的分解進行了相加,最后只有一組符合相加的和不能表示為兩個質數相加。第四句話,P得到Q的消息,把a+b進行了和的拆解,得到多組數字,再對每一組數字相乘,相乘得到的數在進行積的拆解,得到多組數字,在對每一組數字相加,看是否能表示為兩個質數相加,如果能表示,不符合。僅有一組中的一組滿足不能表示為兩個質數相加。(是不是很繞,我也覺得。。。)
簡單點來說,就是
- a,b不都為質數
- a+b不能表示為一組質數相加
- ab的積解的和不能表示為兩個質數相加(僅有一組)
- a+b和解的積的積解的和不能表示為兩個質數相加(僅有一組)
C語言解決
既然跟質數有關,就要寫一個判斷這個數是否為質數的函數
int prime(int i) {int x = 0;for (int j = 2; j < i; j++) {if (i % j == 0) return 0;}return 1; }接著開始寫第二段對話的函數,這個函數判斷和能否表示兩個質數之和
int primecount(int i, int j) {int x = i + j; for (int k = 2; k < x; k++) {int y = x - k;if (prime(k) == 1 && prime(y) == 1) {return 0;}}return 1; }第三句話,傳入i,j,先進行積的拆解,在調用第二段話的函數,判斷和是否表示為兩個質數相加,注意k和y小于SIZE(100)
int Multiplicationcount(int i, int j) {int n = 0;int K = 0, Y = 0;for (int k = 2; k < i * j; k++) {if ((i * j) % k == 0) {int y = i * j / k;if (primecount(k, y)){if (k < SIZE && y < SIZE && k != y) {n++;}}}}return n; }第四句話,分解和在調用第三段話的函數,末尾的判斷看似多此一舉,但是不用的話會出現bug,原因我也不知道
int Additioncount(int i, int j) {int m = 0;int x = i + j;int n = 0;int K = 0, Y = 0;for (int k = 2; k < x-1; k++) {int y = x - k; if (Multiplicationcount(k, y) == 2){if (k < SIZE && y < SIZE && k != y) {K = k;Y = y;n++;}else m++;}}if (m > 0 && n == 2) {n = 0;}else if (m == 0 && n == 2) {if (K == i || Y == i) n == 2;else n == 0;}return n; }主函數,注意==2,是因為遍歷會出現重復的。
void main(){ int x = 0;for (int i = 2; i < SIZE; i++) {for (int j = 2; j < i; j++) {if (prime(i) == 1 && prime(j) == 1) continue;else {if(primecount(i,j)){if(Multiplicationcount(i, j) == 2 && Additioncount(i,j)==2){printf("%d %dn", i, j);}}}}printf("%dn",i);} }運行結果為13和4,運行時間會比較長
結束
總結
以上是生活随笔為你收集整理的c语言数字的拆解_C语言解决变态推理题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql设置数据库同步_MySQL数据
- 下一篇: java messagebox 关闭_w