POJ 1006 Biorhythms(中国剩余定理)

Description

         Some people believe that there are three cycles in a person's life that start the day he or she is born. These three cycles are the physical, emotional, and intellectual cycles, and they have periods of lengths 23, 28, and 33 days, respectively. There is one peak in each period of a cycle. At the peak of a cycle, a person performs at his or her best in the corresponding field (physical, emotional or mental). For example, if it is the mental curve, thought processes will be sharper and concentration will be easier. 
        Since the three cycles have different periods, the peaks of the three cycles generally occur at different times. We would like to determine when a triple peak occurs (the peaks of all three cycles occur in the same day) for any person. For each cycle, you will be given the number of days from the beginning of the current year at which one of its peaks (not necessarily the first) occurs. You will also be given a date expressed as the number of days from the beginning of the current year. You task is to determine the number of days from the given date to the next triple peak. The given date is not counted. For example, if the given date is 10 and the next triple peak occurs on day 12, the answer is 2, not 3. If a triple peak occurs on the given date, you should give the number of days to the next occurrence of a triple peak. 

Input

You will be given a number of cases. The input for each case consists of one line of four integers p, e, i, and d. The values p, e, and i are the number of days from the beginning of the current year at which the physical, emotional, and intellectual cycles peak, respectively. The value d is the given date and may be smaller than any of p, e, or i. All values are non-negative and at most 365, and you may assume that a triple peak will occur within 21252 days of the given date. The end of input is indicated by a line in which p = e = i = d = -1.

Output

For each test case, print the case number followed by a message indicating the number of days to the next triple peak, in the form: 

Case 1: the next triple peak occurs in 1234 days. 

Use the plural form ``days'' even if the answer is 1.

Sample Input

0 0 0 0
0 0 0 100
5 20 34 325
4 5 6 7
283 102 23 320
203 301 203 40
-1 -1 -1 -1

Sample Output

Case 1: the next triple peak occurs in 21252 days.
Case 2: the next triple peak occurs in 21152 days.
Case 3: the next triple peak occurs in 19575 days.
Case 4: the next triple peak occurs in 16994 days.
Case 5: the next triple peak occurs in 8910 days.
Case 6: the next triple peak occurs in 10789 days.

题目意思:

描述:

       有些人认为,一个人从他/她出生开始,生命中有三个周期。这三个周期是身体,情绪和智力周期,他们的周期长度分别为23,28和33天。在每一个周期中都有一个高峰。在一个周期的高峰,一个人在相应的领域(身体,情绪或精神)的表现最好。举例来说,如果它是心理曲线,思维过程将更为剧烈,更容易专心。

        由于不同时期有三个周期,三个周期的高峰一般出现在不同的时间。我们要确定任何人在什么时候出现三重峰(所有三个周期的峰值出现在同一天)。对于每一个周期,你将获得从当前年份其哪些峰(不一定是第一个)一开始出现的天数。你还将得到一个从当年开头的日期的天数数字表示。你的任务是确定的天数从给定的日期到下一个三高峰。给定的日期是不计算在内的。例如,如果给定的日期是10,下一个三重峰在第12天出现,答案是2,不是3。如果一个三重峰在给定的日期时,你应该给的天数到下一个出现的三重峰。这个问题包含多个测试案例!是多输入的第一行是一个整数N,随后有N个输入。每个输入按说明中指出的格式输入。每个输入占一行。有N个输出。每个输出占一行。


输入:

你会得到一个案例。每个案例的输入包括一个四个整数的p,e,i和d。该值p,e和i是距离今年开始的在生理,情绪和智力周期的高峰期的天数。d是给定的日期,可能会比p,e或者i小。所有的值都是非负,最多365,你可以假设一个三重高峰将出现在给定日期的21252天。当p = e= i = d = -1时结束输入。


输出:

对于每一个测试案例,输出到下一个三重峰的天数:输出案例一:未来三重高峰出现在1234天。使用复数形式输出天数,即使天数是1。


解题思路:

本题是中国剩余定理得题型,按中国剩余定理得理解就是一个数sum除23余p,除28余e,除33余i。求这个数与d的差值,注意差值不能为0


代码如下:C/C++代码

//中国剩余定理
#include<stdio.h>
int main()
{
	int p,e,i,d,k,sum,num=1;
	while(scanf("%d%d%d%d",&p,&e,&i,&d))
	{
	    /*判断输入结束的方法,因为p,e,i,d都不小于0
	    因此当p=e=i=d=-1时,p+e+i+d一定等于-4*/
		if(p+e+i+d==-4)
			break;
        /*1288是23和28的公倍数,并且1288%33=1;
          5544是28和33的公倍数,并且5544%23=1;
          14421是23和33的公倍数,并且14421%28=1;
          选择余1,是为了转换成输入的余数,只需乘以输入的数即可*/
		sum=(1288*(i)+5544*(p)+14421*(e))%(21252);
		if(sum>d)
			printf("Case %d: the next triple peak occurs in %d days.\n",num++,sum-d);
		else
			printf("Case %d: the next triple peak occurs in %d days.\n",num++,21252+sum-d);
	}
	return 0;
}



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值