1006这个问题就是简单的利用了中国剩余定理。有一个注意一点的问题,就是计算出最小的满足所有剩余条件的数值之后,别忘记了要与d进行比较,如果比d小,那么就要加三个周期的最小公倍数,直至比d大。然后得出的数值减去d即可。
#include<stdio.h>
#define PHY 23
#define EMO 28
#define INT 33
#define GCD 21252
int main()
{
int p, e, i, d ;
int k1, k2, k3, k ;
int day = 0 ;
// FILE *fp = fopen( "in.txt", "r" ) ;
// fscanf( fp, "%d %d %d %d", &p, &e, &i, &d ) ;
scanf( "%d %d %d %d", &p, &e, &i, &d ) ;
k1 = EMO * INT ;
k = k1 ;
while( k1 % PHY != 1 )
{
k1 = k1 + k ;
}
k2 = PHY * INT ;
k = k2 ;
while( k2 % EMO != 1 )
{
k2 = k2 + k ;
}
k3 = EMO * PHY ;
k = k3 ;
while( k3 % INT != 1 )
{
k3 = k3 + k ;
}
k = 1 ;
while( p != -1 )
{
p = ( p % PHY ) + 1 ;
e = ( e % EMO ) + 1 ;
i = ( i % INT ) + 1 ;
day = k1 * p + k2 * e + k3 * i ;
// printf("%d\n", day);
day = ( day - 1 ) % GCD == 0 ? ( day - 1 ) : ( day - 1 ) % GCD ;
while( day <= d )
{
day = day + GCD ;
}
printf( "Case %d: the next triple peak occurs in %d days.\n", k++, day - d );
scanf( "%d %d %d %d", &p, &e, &i, &d ) ;
// fscanf( fp, "%d %d %d %d", &p, &e, &i, &d ) ;
}
}