POJ1006

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 ) ;

    }

    

}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值