zoukankan      html  css  js  c++  java
  • 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.
    ", count, n );
        }
        return 0;
    }
    View Code
  • 相关阅读:
    【剑指Offer】49把字符串转换成整数
    【剑指Offer】48不用加减乘除做加法
    【剑指Offer】47求1+2+3+...+n
    判断两个线段是否相交
    EM算法--原理
    理解KMP算法
    阿里校招笔试的一道逻辑题
    线性拟合之最小二乘方法和最小距离方法
    Oracle Net Manager 服务命名配置以及用PL/SQL 登陆数据库
    正则表达式总结
  • 原文地址:https://www.cnblogs.com/bxd123/p/10964501.html
Copyright © 2011-2022 走看看