在中國數學史上,廣泛流傳著乙個「韓信點兵」的故事:韓信是漢高祖劉邦手下的大將,他英勇善戰,智謀超群,為漢朝建立了卓越的功勞。據說韓信的數學水平也非常高超,他在點兵的時候,為了知道有多少兵,同時又能保住軍事機密,便讓士兵排隊報數:
請編寫程式計算韓信至少有多少兵。
解體**:
#includeint main()
**很簡單,但是得理解其後面的演算法思想。
李永樂物理
個人的理解題目的條件:
我們首先需要求乙個數num,使得num%5=1,num%6=5,num%7=4,num%11=10
我們得使這個num在滿足以上條件的情況下盡可能小
舉例子:
3、5、7彼此互質,它們的最小公倍數是105。也就是說,105除以3、除以5或者除以7都沒有餘數。如果乙個數字x是滿足要求的,那麼在x上加上幾個105都不會改變它對3、5、7的餘數
如果乙個數字x是滿足要求的,那麼在x上加上幾個105都不會改變它對3、5、7的餘數。
道理:設m對x,y,z分別滿足某種條件例如m%x=i,m%y=j,m%z=k,d是x,y,z的公倍數(不一定要最小公倍數),則對任意m+n*d(n=0、1、2)也滿足取x模為i,取y模為j,取z模為k
延伸:同上,若d是x,y的公倍數,但不是z的公倍數,且d%z=1,即取z模餘1,則對任意m+n*d(n=0、1、2)也滿足取x模為i,取y模為j,但取z模為k+n*1,即(m+n*d)%z=(k+n*1)
對於條件1:
設num=0初始不滿足任何條件
5、6、7的公倍數為210,210模11=19餘1即210%11=1,因此又延伸
可知,num=0+210*10滿足num%11=10
5、6、11的公倍數為330,330模7=47餘1即330%7=1,因此num=210*10+330*4滿足num%7=4,同時滿足num%11=10,因為330為11的倍數,因此對11的取模不產生影響。
5、7、11的公倍數為385,385模6=64餘1即385%6=1,因此num=210*10+330*4+385*5,同時滿足num%11=10,num%7=4,num%6=5.
6、7、11的公倍數為462,924,1386等,462%5=2,924%5=4,1386%5=1,因此選擇1386作為公倍數,方便湊數滿足條件,得num=210*10+330*4+385*5+1386*1=6731
得6731為滿足條件1的數量,即num%5=1,num%6=5,num%7=4,num%11=10。但是6731並不一定是滿足條件的最小的士兵數量。
對於條件2:
由於5、6、7、11中含有三個質數,則它們的最小公倍數為5*6*7*11=2310
由道理知6731%2310=2111是滿足條件的最小的士兵數
韓信點兵python演算法 韓信點兵演算法
秦朝末年,楚漢相爭。一次,韓信將1500名將士與楚王大將李鋒交戰。苦戰一場,楚軍不敵,敗退回營,漢軍也死傷四五百人,於是韓信整頓兵馬也返回大本營。當行至一山坡,忽有後軍來報,說有楚軍騎兵追來。只見遠方塵土飛揚,殺聲震天。漢軍本來已十分疲憊,這時隊伍大譁。韓信兵馬到坡頂,見來敵不足五百騎,便急速點兵迎...
韓信點兵演算法
孫子算經 中給出這類問題的解法 三三數之剩二,則置一百四十 五五數之剩三,置六十三 七七數之剩二,置三十 並之得二百三十三,以二百一十減之,即得。凡三三數之剩一,則置七十 五五數之剩一,則置二十一 七七數之剩一,則置十五,一百六以上,以一百五減之,即得。用現代語言說明這個解法就是 首先找出能被5與7...
韓信點兵演算法
題目 韓信點兵 10 分 在中國數學史上,廣泛流傳著乙個 韓信點兵 的故事 韓信是漢高祖劉邦手下的大將,他英勇善戰,智謀超群,為漢朝建立了卓越的功勞。據說韓信的數學水平也非常高超,他在點兵的時候,為了知道有多少兵,同時又能保住軍事機密,便讓士兵排隊報數 按從1至5報數,記下最末乙個士兵報的數為1 再...