poj1006 / hdu1370 Biorhythms (中国剩余定理)

本文介绍了一道关于生物节律的编程题,利用中国剩余定理解决了一个数学问题,给出了两种不同的解题思路,并提供了完整的代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Biorhythms

题意:读入p,e,i,d 4个整数,已知(n+d)%23=p;   (n+d)%28=e;   (n+d)%33=i ,求n 。        (题在文末)

 

知识点:中国剩余定理。 /*解释*/

 

题解:已知(n+d)%23=p;   (n+d)%28=e;   (n+d)%33=i 
       33×28×a模23的逆元为8,  则33×28×8=5544; 
       23×33×b模28的逆元为19,则23×33×19=14421; 
       23×28×c模33的逆元为2,  则23×28×2=1288。 
      因此有(5544×p+14421×e+1288×i)% lcm(23,28,33) =n+d       (
lcm(23,28,33)= 21252)
     所以n=(5544×p+14421×e+1288×i-d)%21252

本题所求的是最小整数解,避免n为负,因此最后结果 n=(n+21252)% 21252

so n=(5544*p+14421*e+1288*i-d+21252)%21252;

#include<iostream>  
using namespace std;  
   
int main()  
{  
    int p,e,i,d;  
    for(int kase=1;;kase++)
    { 
    <span style="white-space:pre">	</span>while(cin>>p>>e>>i>>d)  
   <span style="white-space:pre">	</span>{  
       <span style="white-space:pre">	</span>     if(p==-1 && e==-1 && i==-1 && d==-1)  
        <span style="white-space:pre">	</span>    break;  
            int lcm=21252;  
            int n=(5544*p+14421*e+1288*i-d+21252)%21252;  
            if(n==0)  
                n=21252;  
            cout<<"Case "<<kase<<": the next triple peak occurs in "<<n<<" days."<<endl;  
        }
    }  
    return 0;  
}  



其实上面是别人的解法:http://blog.youkuaiyun.com/lyy289065406/article/details/6648551

 

我的解法:

//我的另一种解法:没上面方法好,就不写题解了。。
//其实是忘了当时咋想的了,只记得没用中国剩余定理。。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
 
int main()
{
    for(int kase=1;;kase++)
    {
        int p,e,i,d;
        cin>>p>>e>>i>>d;
        if(p==-1&&e==-1&&i==-1)
        {
            break;
        }
        int ii=i-i/33*33;
        int j;
        for(j=d+1;j<=21252*2;j++)
        {
            if((j-ii)%33==0)
                break;
        }
        for(;j<=21252*2;j+=33)
        {
            if((j-(e-e/28*28))%28==0&&(j-(p-p/23*23))%23==0)
            {
                printf("Case %d: the next triple peak occurs in %d days.\n",kase,j-d);
                break;
            }
        }
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值