生物节律

1084:生物节律 分数:2

时间限制:1 秒
内存限制:32 兆
特殊判题:


标签

  • 数学题

题目描述

有些人相信,人从出生开始就有三个生物周期。这三个生物周期分别是体力,情绪和智力,周期分别为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.

【分析】

       做这道题的时候让我想到了此前所提到的一道简单的数学编程题“鸡兔同笼”。同样地,我们可以考虑体力生物周期经过了 x 个周期,情绪生物周期经过了 y 个周期,智力生物周期经过了 z 个周期。为了使三个生物周期同时到达高潮,不同的生物周期要经过不同的周期数。我们先不考虑给定的日期 d,那么对于体力生物周期而言,已知它到达高潮时距离年初的天数 p,则经过 x 个周期后达到高潮时距离年初的天数为 p + x * 23。(23为体力生物周期的周期)类似地,情绪生物周期经过 y 个周期后达到高潮时距离年初的天数为 e + y * 28。(28为情绪生物周期的周期);智力生物周期经过 z 个周期后达到高潮时距离年初的天数为 i + z * 33。(33为智力生物周期的周期)

       可想而知,想让三个生物周期同时达到高潮,那么只要使得三者各自到达高潮时距离年初的天数相等即可,即 p + x * 23 = e + y * 28 = i + z * 33。则 y = (p + x * 23 - e) / 28,z = (p + x * 23 - i) / 33。现在我们所要求的是当 x 为何值时,(p + x * 23 - e) 能被28整除且(p + x * 23 - i) 能被33整除,此时的 y 和 z 才在真正意义上存在。我们可以通过穷举 x = 0,1,2,......当条件成立时,说明此时 p + x * 23 就是距离最近将同时达到高潮时距离年初的天数。

       现在,我们再来考虑这个给定的日期 d,我们只要保证 x 满足条件后同时要 p + x * 23 > d(否则继续穷举求 x 的值)即可,也就是说保证达到高潮的时间是在给定日期之后。

       从中我们可以发现像“鸡兔同笼”、“生物节律"这样的数学编程题,都用到了运用未知数创建方程,再利用代入法,用其中一个未知数来表示其他未知数,这样我们所要考虑的范围将大大减少。(在此,也是为了提醒我自己,以后这样的数学题,大多用的是数学思想,即用数学知识就可解答问题,只是我们要在这样的数学架构下编程而已。)

用java语言编写程序,代码如下:

import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		Scanner input = new Scanner(System.in);
		int caseNum = 0;
		while(input.hasNext()) {
			int p = input.nextInt();
			int e = input.nextInt();
			int i = input.nextInt();
			int d = input.nextInt();
			
			if(p == -1 && e == -1 && i == -1 && d == -1)
				break;
			
			int temp = 0;
			for(int x = 0;;x++) {
				temp = p + 23 * x;
				if((temp - e) % 28 == 0 && (temp - i) % 33 == 0 && temp > d) {
					System.out.println("Case " + ++caseNum +": the next triple peak occurs in " 
							+ (temp - d) + " days.");
					break;
				}
			}
		}
	}
}



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值