韓信點兵演算法題解

2021-10-14 03:59:48 字數 1411 閱讀 9961

在中國數學史上,廣泛流傳著乙個「韓信點兵」的故事:韓信是漢高祖劉邦手下的大將,他英勇善戰,智謀超群,為漢朝建立了卓越的功勞。據說韓信的數學水平也非常高超,他在點兵的時候,為了知道有多少兵,同時又能保住軍事機密,便讓士兵排隊報數:

請編寫程式計算韓信至少有多少兵。

解體**:

#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 再...