1002 题解
这道题用了 中国剩余定理,开始不知道只是硬想结果总是超时后来向高人请教了一下才通过.基础很重要啊.
若某数x分别被d1、、…、dn除得的余数为r1、r2、…、rn,则可表示为下式:
x=R1r1+R2r2+…+Rnrn+RD
其中R1是d2、d3、…、dn的公倍数,而且被d1除,余数为1;
R1 、R2…、Rn是d1、d2、…、dn-1的公倍数,而且被dn除,余数为1;
D是d1、d2、…、的最小公倍数;
R是任意整数,可根据实际需要决定;
且d1、、…、必须互质,以保证每个Ri(i=1,2,…,n)都能求得.
// 改进后
#include < stdio.h >
int main()
... {
int p,e,i,d,a,t=0;
while(1)
...{
scanf("%d%d%d%d",&p,&e,&i,&d);
if(p==-1 && e==-1 && i==-1 && d==-1)
break;
// 5544 14421 1288 已求
a=(5544*p+14421*e+1288*i-d+21252)%21252;
if(!a)
a=21252;
printf("Case %d: the next triple peak occurs in %d days. ",++t,a);
}
return 0;
} // 无法通过的代码
#include < stdio.h >
int main()
... {
int i=0;
int j=0;
int a[100][4];
int p,e,m,d;
int temp=1;
int n=0;
int days=0;
do
...{
scanf("%d %d %d %d",&p,&e,&m,&d);
days=0;
p=p%23;
e=e%28;
m=m%33;
while(1)
...{
days=p+23*n;
if(days%28==e&&days%33==m&&(days-d>0))
...{
printf("Case %d: the next triple peak occurs in %d days. ",j+1,days-d);
break;
}
n++;
}
}while(p!=-1&&e!=-1&&m!=-1&&d!=-1);
return 1;
}
1002 题解
这道题用了 中国剩余定理,开始不知道只是硬想结果总是超时后来向高人请教了一下才通过.基础很重要啊.
若某数x分别被d1、、…、dn除得的余数为r1、r2、…、rn,则可表示为下式:
x=R1r1+R2r2+…+Rnrn+RD
其中R1是d2、d3、…、dn的公倍数,而且被d1除,余数为1;
R1 、R2…、Rn是d1、d2、…、dn-1的公倍数,而且被dn除,余数为1;
D是d1、d2、…、的最小公倍数;
R是任意整数,可根据实际需要决定;
且d1、、…、必须互质,以保证每个Ri(i=1,2,…,n)都能求得.
// 改进后
#include < stdio.h >
int main()
... {
int p,e,i,d,a,t=0;
while(1)
...{
scanf("%d%d%d%d",&p,&e,&i,&d);
if(p==-1 && e==-1 && i==-1 && d==-1)
break;
// 5544 14421 1288 已求
a=(5544*p+14421*e+1288*i-d+21252)%21252;
if(!a)
a=21252;
printf("Case %d: the next triple peak occurs in %d days. ",++t,a);
}
return 0;
} // 无法通过的代码
#include < stdio.h >
int main()
... {
int i=0;
int j=0;
int a[100][4];
int p,e,m,d;
int temp=1;
int n=0;
int days=0;
do
...{
scanf("%d %d %d %d",&p,&e,&m,&d);
days=0;
p=p%23;
e=e%28;
m=m%33;
while(1)
...{
days=p+23*n;
if(days%28==e&&days%33==m&&(days-d>0))
...{
printf("Case %d: the next triple peak occurs in %d days. ",j+1,days-d);
break;
}
n++;
}
}while(p!=-1&&e!=-1&&m!=-1&&d!=-1);
return 1;
}