poj1006——生理周期

本文通过一个具体的数学问题,介绍了如何运用中国同余定理寻找满足特定条件的最小正整数。通过分解问题并逐步求解,最终找到了一个有效的解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

中国同余定理的应用。

看一个例子 你就明白:

1 :一个数被 3 除余 1 ,被 4 除余 2 ,被 5 除余 4 ,这个数最小是几?
题中 345 三个数两两互质。

则〔 45=20 ;〔 35=15 ;〔 34=12 ;〔 345=60
为了使 203 除余 1 ,用 20×2=40
使 154 除余 1 ,用 15×3=45
使 125 除余 1 ,用 12×3=36
然后, 40×145×236×4=274
因为, 274>60 ,所以, 27460×4=34 ,就是所求的数。 来源于:http://eblog.cersp.com/userlog/7978/archives/2008/723693.shtml

将此算法应用于此题即可!该注意的一点问题已在程序中标注。

#include<iostream> #include<cstdio> #include<cstring> using namespace std; #define maxn 21252 int main() { int p,e,i,d,ca=1; while(1) { cin>>p>>e>>i>>d; if(p+e+i+d==-4) break; const int r1=23,r2=28,r3=33; int re1=r2*r3,re2=r1*r3,re3=r1*r2,re=r1*r2*r3; int res1=re1,res2=re2,res3=re3; while(res1%r1!=1) res1+=re1; while(res2%r2!=1) res2+=re2; while(res3%r3!=1) res3+=re3; res1*=p;res2*=e;res3*=i; int k=re; while(res1+res2+res3>k) { k+=re; } k-=re; int t=(res1+res2+res3-k-d+21252)%21252;//可能出现负数 故加之后再取余! if(t==0) printf("Case %d: the next triple peak occurs in %d days.\n",ca++,21252); else printf("Case %d: the next triple peak occurs in %d days.\n",ca++,t); } return 0; }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值