点击打开链接
题意:
人有三个循环,循环周期分别为23,28,33,给你这三个周期出现的时间a,b,c,以及开始计算的天数d。求三个周期在同一天的时间。。。
a=(n-d)%23;
b=(n-d)%28
c=(n-d)%33;
23 28 33互质可以用中国剩余定理
ps:自己犯了一个小错误,debug好长时间。。
#include"stdio.h" #include"string.h" #define N 4 int A[N],R[N],k; void exgcd(int a,int b,int &x,int &y) { if(b==0) { x=1;y=0; } else { exgcd(b,a%b,x,y); int t=x; x=y; y=t-(a/b)*y; } } int china_reminder(int a[],int r[],int k) { int i; int x,y; int n,m; int ans; ans=0;n=1; for(i=0;i<k;i++) n*=a[i]; for(i=0;i<k;i++) { m=n/a[i]; exgcd(m,a[i],x,y); ans=(ans+m*x*r[i]+n)%n;//不要写成ans+=.. } if(ans<=0)ans+=n; return ans; } int main() { int ans; int d; int t=1; int a,b,c; scanf("%d",&a); while(scanf("%d%d%d%d",&a,&b,&c,&d)!=-1) { if(a==-1&&b==-1&&c==-1&&d==-1)break; k=3; a%=23;b%=28;c%=33; A[0]=23;R[0]=a; A[1]=28;R[1]=b; A[2]=33;R[2]=c; ans=china_reminder(A,R,k); ans-=d; if(ans<=0)ans+=23*28*33; printf("Case %d: the next triple peak occurs in %d days.\n",t++,ans); } return 0; }