Biorhythms 中国剩余定理

  

题意
  人自出生起就有体力,情感和智力三个生理周期,分别为23,28和33天。一个周期内有一天为峰值,在这一天,人在对应的方面(体力,情感或智力)表现最好。通常这三个周期的峰值不会是同一天。现在给出三个日期,分别对应于体力,情感,智力出现峰值的日期。然后再给出一个起始日期,要求从这一天开始,算出最少再过多少天后三个峰值同时出现。
 
 
这题是中国剩余定理终极水题(连模板都算不上)  但是中国剩余定理一直是我心中的痛。。
 

中国剩余定理

  在《孙子算经》中有这样一个问题:“今有物不知其数,三三数之剩二(除以3余2),五五数之剩三(除以5余3),七七数之剩二(除以7余2),问物几何?”这个问题称为“孙子问题”,该问题的一般解法国际上称为“中国剩余定理”。具体解法分三步:

    1. 找出三个数:从3和5的公倍数中找出被7除余1的最小数15,从3和7的公倍数中找出被5除余1 的最小数21,最后从5和7的公倍数中找出除3余1的最小数70。
    2. 用15乘以2(2为最终结果除以7的余数),用21乘以3(3为最终结果除以5的余数),同理,用70乘以2(2为最终结果除以3的余数),然后把三个乘积相加152+213+70215∗2+21∗3+70∗2得到和233。
    3. 用233除以3,5,7三个数的最小公倍数105,得到余数23,即233%105=23233%105=23。这个余数23就是符合条件的最小数。

 

  使 33 * 28 * a % 23 = 1,得a = 6; 33 * 28 * 6 = 5544; 

  使23 * 33 * b % 28 = 1, 得b = 19;23 * 33 * 19 = 14421; 
  使23 * 28 * c % 33 = 1, 得c = 2;  23 * 28 * 2 = 1288。 

  那么x  =  5544 * p + 14421 * e + 1288 * i
  

 
#include<stdio.h>
 
#define MAX 21252
 
int main()
{
    int p, e, i, d, n, count = 0;
    
    while( scanf("%d%d%d%d", &p, &e, &i, &d) != EOF )
    {
                count++;
        if(p == -1 && e == -1 && i == -1 && d == -1)
        {
            break;
                }
 
        n = ( 5544 * p + 14421 * e + 1288 * i - d ) % MAX;
        
        if( n <= 0 )   // 范围限制 
        {
            n += 21252;
                }
        
        printf("Case %d: the next triple peak occurs in %d days.\n", count, n );
    }
    return 0;
}
View Code

 

 

 

 

转载于:https://www.cnblogs.com/bxd123/p/10964501.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值