#include
#include
#include
int main()
{
int a,b,c,d;
int i,j,k;
int count=0;
int t=23*28;
while(1)
{
count++;
scanf("%d %d %d %d", &a, &b ,&c,&d);
if(-1==a)
break;
for(i=d+1;i<21252;i++)
if(0==(i-a)%23) break;
for(;i<21252;i+=23)
if(0==(i-b)%28) break;
for(;i<21252;i+=t)
if(0==(i-c)%33) break;
printf("Case %d: the next triple peak occurs in %d days.\n",count,i-d);
}
return 0;
}
简化:已知 n%3=2,n%5=3,n%7=2,求n。
再看我们这道题,读入p,e,i,d 4个整数,已知(n+d)%23=p; (n+d)%28=e; (n+d)%33=i ,求n 。
是不是一样呢?
呵呵,确实一样。想到这里觉得很兴奋。但是韩信是怎么计算出结果的呢?
随便google了一下,原来这个东西叫“中国剩余定理”,《孙子算经》中就有计算方法。
韩信应该是这样算的:
因为n%3=2,n%5=3,n%7=2且3,5,7互质
使5×7被3除余1,用35×2=70;
使3×7被5除余1,用21×1=21;
使3×5被7除余1,用15×1=15。
(70×2+21×3+15×2)%(3×5×7)=23
同样,这道题也应该是:
要求的那天对于23取余应该是p,对于28取余应该是e,对于33取余应该是i.
使33×28被23除余1,用33×28×8=5544;
使23×33被28除余1,用23×33×19=14421;
使23×28被33除余1,用23×28×2=1288。
(5544×p+14421×e+1288×i)%(23×28×33)=n+d
n=(5544×p+14421×e+1288×i-d)%(23×28×33)
阅读(443) | 评论(0) | 转发(0) |