參考:https://zhidao.baidu.com/question/1370246313435392139.html
在一千多年前的《孫子算經》中,有這樣一道算術題:“今有物不知其數,三三數之剩二,五五數之剩三,七七數之剩二,問物幾何?”按照今天的話來說:一個數除以3余2,除以5余3,除以7余2,求這個數。這樣的問題,也有人稱為“韓信點兵”。它形成了一類問題,也就是初等數論中的解同余式。
①有一個數,除以3余2,除以4余1,問這個數除以12余幾?
解:除以3余2的數有:2,5,8,11,14,17,20,23……
它們除以12的余數是:2,5,8,11,2,5,8,11……
除以4余1的數有:1,5,9,13,17,21,25,29……
它們除以12的余數是:1,5,9,1,5,9……
一個數除以12的余數是唯一的.上面兩行余數中,只有5是共同的,因此這個數除以12的余數是5。如果我們把①的問題改變一下,不求被12除的余數,而是求這個數。很明顯,滿足條件的數是很多的,它是5+12×整數,整數可以取0,1,2,……,無窮無盡。
事實上,我們首先找出5后,注意到12是3與4的最小公倍數,再加上12的整數倍,就都是滿足條件的數.這樣就是把“除以3余2,除以4余1”兩個條件合並成“除以12余5”一個條件。
《孫子算經》提出的問題有三個條件,我們可以先把兩個條件合並成一個.然后再與第三個條件合並,就可找到答案。
②一個數除以3余2,除以5余3,除以7余2,求符合條件的最小數。
解:先列出除以3余2的數:2,5,8,11,14,17,20,23,26……
再列出除以5余3的數:3,8,13,18,23,28……
這兩列數中,首先出現的公共數是8。3與5的最小公倍數是15。兩個條件合並成一個就是8+15×整數,列出這一串數是8,23,38,……,再列出除以7余2的數2,9,16,23,30……就得出符合題目條件的最小數是23。
事實上,我們已把題目中三個條件合並成一個:被105除余23。
下面看一道無聊的題目:
滂沱大雨中,某司機途徑一個十字路口,看到有一位老奶奶倒在地上,情況不明。他將車靠邊停好后,打開行車記錄儀,同時報了警和撥打120,然后上前給老奶奶撐傘,詢問老奶奶的情況,並一直等到警察前來,將老奶奶送上了救護車,他才悄然駕車離去。警察通過查看監控錄像,知道老奶奶是自己滑倒的,老奶奶的家人通過媒體尋找這位做好事不留名“任性”司機大哥。以下是幾個事故現場目擊者通過撥打電台熱線電話對任性大哥的車牌號的描述。
甲說:我記得該車的車牌號碼上有4位阿拉伯數字,而且第一位不是0。
乙說:我記得該車的車牌號碼是小於1100的數。
丙說:我用該車牌號碼除以3剛好余2。
丁說:我用該車牌號碼除以5剛好余4。
戊說:我用該車牌號碼除以7剛好余1。
根據題意在下畫線處補充代碼,完善程序,以便得出車牌號碼。
問題分析:按照上面的論述,可以列出如下表格
所以只要計算出滿足105x+29的數字即可。
代碼如下:
1 #include <stdio.h> 2 void fun1() 3 { 4 int i; 5 for(i=1000;i<=1100;i++) 6 { 7 if(i%3==2 && i%5==4 && i%7==1) 8 { 9 printf("form fun1: res=%d\n",i); 10 } 11 } 12 } 13 void fun2() 14 { 15 int i; 16 for(i=1000;i<=1100;i++) 17 { 18 if(i%105==29) 19 { 20 printf("form fun2: res=%d\n",i); 21 } 22 } 23 } 24 int main(int argc, char *argv[]) 25 { 26 fun1(); 27 fun2(); 28 return 0; 29 }
運行結果: