c语言数字的拆解_C语言解决变态推理题
有兩個數(shù),a和b。a大于等于b,而且二者都是2到99之間的正整數(shù)。
現(xiàn)在我當著P和Q的面,分別悄悄告訴了P先生a和b的和,告訴了Q先生a和b的積。
接下來有這么一段對話:
Q:我不知道a和b分別是啥。
P:我知道你不知道,我也不知道。
Q:那我現(xiàn)在知道了。
P:那我現(xiàn)在也知道了。
請問a和b分別是什么?
這幾天偶然看到這題,我不禁想到我高中時被這個問題支配一個晚上的恐懼,現(xiàn)在有了計算機,我們試試用計算機解決該問題。
現(xiàn)在我們首先要從這簡單的對話得到一些消息。第一句話,Q說不知道a,b是什么,說明了a和b不都為質(zhì)數(shù),若都為質(zhì)數(shù)則ab有唯一的分解。第二句話,說明P知道a+b不能表示為兩個質(zhì)數(shù)相加得到,不然如果能表示,那么P就不能肯定Q不知道a和b。第三句話,Q得到第二句話的消息后,對ab所有的乘的分解進行了相加,最后只有一組符合相加的和不能表示為兩個質(zhì)數(shù)相加。第四句話,P得到Q的消息,把a+b進行了和的拆解,得到多組數(shù)字,再對每一組數(shù)字相乘,相乘得到的數(shù)在進行積的拆解,得到多組數(shù)字,在對每一組數(shù)字相加,看是否能表示為兩個質(zhì)數(shù)相加,如果能表示,不符合。僅有一組中的一組滿足不能表示為兩個質(zhì)數(shù)相加。(是不是很繞,我也覺得。。。)
簡單點來說,就是
- a,b不都為質(zhì)數(shù)
- a+b不能表示為一組質(zhì)數(shù)相加
- ab的積解的和不能表示為兩個質(zhì)數(shù)相加(僅有一組)
- a+b和解的積的積解的和不能表示為兩個質(zhì)數(shù)相加(僅有一組)
C語言解決
既然跟質(zhì)數(shù)有關(guān),就要寫一個判斷這個數(shù)是否為質(zhì)數(shù)的函數(shù)
int prime(int i) {int x = 0;for (int j = 2; j < i; j++) {if (i % j == 0) return 0;}return 1; }接著開始寫第二段對話的函數(shù),這個函數(shù)判斷和能否表示兩個質(zhì)數(shù)之和
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,先進行積的拆解,在調(diào)用第二段話的函數(shù),判斷和是否表示為兩個質(zhì)數(shù)相加,注意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; }第四句話,分解和在調(diào)用第三段話的函數(shù),末尾的判斷看似多此一舉,但是不用的話會出現(xià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; }主函數(shù),注意==2,是因為遍歷會出現(xiàn)重復的。
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);} }運行結(jié)果為13和4,運行時間會比較長
結(jié)束
總結(jié)
以上是生活随笔為你收集整理的c语言数字的拆解_C语言解决变态推理题的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql设置数据库同步_MySQL数据
- 下一篇: access根据所属院系修改学号_五个a