1059 - 生物节律
时间限制 : 1 秒
内存限制 : 32 MB
有些人相信,人从出生开始就有三个生物周期。这三个生物周期分别是体力,情绪和智力,周期分别为23,28和33天。在每个周期里都有一个高潮。在一个周期中高潮的时候,人们在相应的方面(体力,情绪和智力)达到最佳状态。例如,如果是心理曲线达到高潮,思考将变得睿智,注意力更容易集中。
由于这三个生物周期都不同,所以它们产生高潮的时间都是不同的。我们想要确定一个人什么时候这三个高潮将会同时发生(这三个高潮产生在同一天)。已知每个生物周期上次高潮产生时距离年初的天数(不一定是第一次产生),以及从年初开始的一个天数(起始时间)。你的任务是求出下次三个生物周期高潮同时产生时,距离起始时间的天数,不包括起始时间那天。
例如,起始时间的天数是10,而下次三个生物周期高潮同时产生的时间为12,则答案是2,而不是3。如果三个生物周期高潮同时产生时就在起始时间那天,你要计算出下一次三个生物周期高潮同时产生的天数。
题目输入
输入包含多组测试数据。每组输入四个整数p,e,i和d。数值p,e和i分别表示体力,情绪和智力达到高峰时距离年初的天数。数值d是给定的日期,也许小于p,e或i。所有数值都是非负的,小于等于365。你可以假定三个生物周期高潮同时产生时,距离起始时间的天数在21252天之内。
当p=e=i=d=-1时,输入结束。
题目输出
对于每组输入,输出测试例编号,接着是下次三个生物周期高潮同时产生的时间,格式如下:
Case 1: the next triple peak occurs in 1234 days.
即使答案只有一天,也用复数形式“days”表示。
输入/输出样例
输入格式
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
输出格式
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.
C语言解答
#include<stdio.h> int main() { int p,e,i,d,j,c=0; while(scanf("%d%d%d%d",&p,&e,&i,&d),p!=-1) { for(j=d+1;;j++) if((j-p)%23==0&&(j-e)%28==0&&(j-i)%33==0) break; printf("Case %d: the next triple peak occurs in %d days.\n",++c,j-d); } return 0; }
C++解答
#include<stdio.h> int main() { int p,e,i,d,j,c=0; while(scanf("%d%d%d%d",&p,&e,&i,&d),p!=-1) { for(j=d+1;;j++) if((j-p)%23==0&&(j-e)%28==0&&(j-i)%33==0) break; printf("Case %d: the next triple peak occurs in %d days.\n",++c,j-d); } return 0; }
Java解答
import java.util.*; public class Main{ public static void main(String[] args){ Scanner in=new Scanner(System.in); int count = 1; while(in.hasNextInt()){ int p=in.nextInt()%23; int e=in.nextInt()%28; int i=in.nextInt()%33; int d=in.nextInt(); int day = 0; int j = 1, k = 1, l = 1; if(p==-1&&e==-1&&i==-1&&d==-1) break; while((28*33*j)%23!=1) j++; while((23*33*k)%28!=1) k++; while((23*28*l)%33!=1) l++; day = (28*33*j*p+23*33*k*e+23*28*l*i)%21252; if(day==d) day = 21252; else if(day<d) day = 21252-(d-day); else day = day-d; System.out.println("Case "+count+": the next triple peak occurs in "+day+" days."); count++; } } }