?? 中國剩余定理.txt
字號:
民間傳說著一則故事——“韓信點兵”。
秦朝末年,楚漢相爭。一次,韓信將1500名將士與楚王大將李鋒交戰。苦戰一場,楚軍不敵,敗退回營,漢軍也死傷四五百人,于是韓信整頓兵馬也返回大本營。當行至一山坡,忽有后軍來報,說有楚軍騎兵追來。只見遠方塵土飛揚,殺聲震天。漢軍本來已十分疲憊,這時隊伍大嘩。韓信兵馬到坡頂,見來敵不足五百騎,便急速點兵迎敵。他命令士兵3人一排,結果多出2名;接著命令士兵5人一排,結果多出3名;他又命令士兵7人一排,結果又多出2名。韓信馬上向將士們宣布:我軍有1073名勇士,敵人不足五百,我們居高臨下,以眾擊寡,一定能打敗敵人。漢軍本來就信服自己的統帥,這一來更相信韓信是“神仙下凡”、 “神機妙算”。于是士氣大振。一時間旌旗搖動,鼓聲喧天,漢軍步步進逼,楚軍亂作一團。交戰不久,楚軍大敗而逃。
在一千多年前的《孫子算經》中,有這樣一道算術題:
今有物不知其數,三三數之剩二,五五數之剩三,七七數之剩二,問物幾何?
用數學符號描述此題為:求,使其滿足:
解此方程有如下歌訣:
三人同行七十稀,五樹梅花廿一枝,
七子共黨中秋月,除百零五便得知。
意為:用70乘3除所得的余數,21乘5除所得的余數,15乘7除所得的余數,再將其相加,然后減105的倍數即可以求得結果。具體計算為:
觀察上式不難發現,70為5和7的倍數且3除恰好余1;21為3和7的倍數且5除恰好余1;15為3和5的倍數且7除恰好余1。而將70乘除以3的余數2,得到的結果除以3就余2了。
于是,我們的到了如下解法:
1. INPUT
2.
3. FOR DO
4.
5.
6. FOR DO
WHILE DO
7.
8.
9. FOR DO
10. OUTPUT
11. END
POJ的1006題,中國剩余定理,終于AC了,主要錯誤出在以下三個方面
[1]對題目的理解上的偏差
[2]中國剩余定理的算法
[3]對結果<0時的處理
下面是我的AC代碼,其中求y[i]的時候算法復雜了,還沒看懂最簡單的算法。
整個程序使用時間75MS,內存92K。還有很大優化的余地。
程序代碼
#include<iostream>
using namespace std;
main()
{
int b[3],n[3],y[3],d,i,M,days,times=1;
int m[3]={23,28,33};
M=m[0]*m[1]*m[2];
cin >>b[0]>>b[1]>>b[2]>>d;
while(b[0]!=-1)
{
days=0;
for(i=0;i<3;i++)
b[i]=b[i]%m[i];
for(i=0;i<3;i++)
{
int j=1;
n[i]=M/m[i];
while((n[i]*j)%m[i]!=1)//用循環計算y[i]應該是整個程序中最爛的算法
j++;
y[i]=j;
}
for(i=0;i<3;i++)
days=days+b[i]*y[i]*n[i];
days=(days+M)%M;
days=days-d;
if(days<=0)days+=M;
cout <<"Case "<<times<<": the next triple peak occurs in "<<days<<" days."<<endl;
times++;
cin >>b[0]>>b[1]>>b[2]>>d;
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -