每天一道算法_7_Biorhythms

DescriptionSome 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

大家好,又见面了,我是全栈君。

Description

 

人生来就有三个生理周期,分别为体力、感情和智力周期,它们的周期长度为23天、28天和33天。每一个周期中有一天是高峰。在高峰这天,人会在相应的方面表现出色。例如,智力周期的高峰,人会思维敏捷,精力容易高度集中。因为三个周期的周长不同,所以通常三个周期的高峰不会落在同一天。对于每个人,我们想知道何时三个高峰落在同一天。对于每个周期,我们会给出从当前年份的第一天开始,到出现高峰的天数(不一定是第一次高峰出现的时间)。你的任务是给定一个从当年第一天开始数的天数,输出从给定时间开始(不包括给定时间)下一次三个高峰落在同一天的时间(距给定时间的天数)。例如:给定时间为10,下次出现三个高峰同天的时间是12,则输出2(注意这里不是3)。

 

Input

 

输入四个整数:p, e, i和d。 p, e, i分别表示体力、情感和智力高峰出现的时间(时间从当年的第一天开始计算)。d 是给定的时间,可能小于p, e, 或 i。 所有给定时间是非负的并且小于365, 所求的时间小于21252。 

当p = e = i = d = -1时,输入数据结束。 
 

Output

 

从给定时间起,下一次三个高峰同天的时间(距离给定时间的天数)。 

采用以下格式: 

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

注意:即使结果是1天,也使用复数形式“days”。
 
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.

 

刚开始按照自己的思路,就是用了三个嵌套循环遍历所有可能出现的情况,但是三个周期总是没有相等的值,不知错在哪里,代码如下,希望大神研究研究:

 

import java.util.Scanner;

public class Biorhythms {
	static int pp = 23;
	static int ee = 28;
	static int ii = 33;

	public static void main(String args[]) {
		Scanner in = new Scanner(System.in);
		int all = in.nextInt();
		int[] array = new int[all * 4];
		for (int i = 0; i < array.length; i++) {
			array[i] = in.nextInt();
		}
		int days = 0;
		for (int j = 0; j < all; j++) {
			int p = array[4 * j];
			int e = array[4 * j + 1];
			int i = array[4 * j + 2];
			int d = array[4 * j + 3];
			days = getDays(p, e, i, d);

			System.out.println("Case " + (j + 1)
					+ ": the next triple peak occurs in " + days + " days.");
		}
	}

	public static int getDays(int ps, int es, int is, int ds) {
		int y = 0;
		int p = ps;
		int e = es;
		int i = is;
		int d = ds;
		System.out.println(" p-->" + p + " e-->" + e + " i-->" + i);
		for (; p < 21252; p = p + pp) {
			for (; e < p; e = e + ee) {
				for (; i < e; i = i + ii) {
					System.out.println(" p-->" + p + " e-->" + e + " i-->" + i);
					if (p == e && p == i && e == i) {
						y = p - d;
						break;
					}
				}
			}
		}
		return y;
	}

}

 

自己没做出来,就百度了一下资料,结果如下了,比较正规的解法:

这是一道典型的中国剩余定理(孙子定理)题,百科地址http://baike.baidu.com/link?url=vupDWKyEG0vb-4vi7PtvRsXV-wrWd0O8qg1Dx8SzlaFC6bt0fRi_0X9kkiXNWrFPJ5ID3kSE5K7WBuPFMBSaeei2PIFb4qYWv7PWn98A9xdR3c1oZJuYev_MJuwMipJ0BXOAGRdJCp8X5NjkfTGxhzRLU6iPdxwbrToG-gKBaNS

根据题意其实就是一个数被23整除余数是Lp=p % 23(p被23整除的余数),被28整除余数是Le=e % 28((e被28整除的余数),被33整除余数是Li=i % 33(i被33整除的余数),求这个数的最小正整数。这里之说以要p % 23而不是直接p是因为题目中提示并不是第一次到达最佳状态。

    做法:
    首先算出能被23整除余1并且能被28和33同时整除的数,能被28整除余1并且能被23和33同时整除的数,能被33整除余1并且能被23和28同时整除的数。所以ei=28*33=924,pi=23*33=759,pe=23*28=644,i=23*28*33=21252;
所以如果924*n % 23==1的话那么这个924*n就应该是我们在上一步中所要求的第一个数,其他三个数同理,记作P,E,I;因为余数是p,e,i并不是1所以最后都应该乘上去,结果就是(P*p+E*e+I*i) % 21252。
    最后要对算出来的日期和题目所给的d进行比较,如果相等直接输出21252,如果比给的日期大,那么输出还必须减去d。如果比结果小必须输出21252-(d-结果);
 
下面是代码:

 

import java.util.Scanner;
public class Main{
	public static void main(String[] args)throws Exception{
		Scanner cin=new Scanner(System.in);
		int m=1;
		while(cin.hasNext()){
			int p=0,e=0,i=0,d=0,lp=1,le=1,li=1,finalNum=0;
			p=cin.nextInt() % 23;
			e=cin.nextInt() % 28;
			i=cin.nextInt() % 33;
			d=cin.nextInt();
			if(p==-1||e==-1||i==-1||d==-1)break;
			while((924*lp) % 23!=1){
				lp++;
			}
			while((759*le) % 28!=1){
				le++;
			}
			while((644*li) % 33!=1){
				li++;
			}
			finalNum=(924*lp*p+759*le*e+644*li*i) % 21252;
			System.out.println(finalNum);
			if(finalNum==d){
				finalNum=21252;
			}else if(finalNum<d){
				finalNum=21252-(d-finalNum);
			}else if(finalNum>d){
				finalNum=finalNum-d;
			}
			System.out.println("Case "+m+": the next triple peak occurs in "+finalNum+" days.");
			m++;
		}
	}
}

 

作者:jason0539

微博:http://weibo.com/2553717707

博客:http://blog.csdn.net/jason0539(转载请说明出处)

 

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/121383.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 决策树原理简介[通俗易懂]

    决策树原理简介[通俗易懂]基于决策树(DT)的算法如RF、GBDT在各种工业场景有着广泛的应用,了解决策树基础算法非常重要,下面我们就对于决策树算法做一下总结决策树分类器基本思想决策树是一种基于分治法的分类器。假设我们有若干个样本点,把它们放在一个节点内,按照最原始的方法对数据做分类,我们可以对节点内部的样本标签做统计,每一个新的样本都可以归为标签的众数(数量最多的标签);当然,这个方法太粗暴没有实用价值,那么我们…

    2025年10月4日
    2
  • C语言读写文件

    C语言读写文件一:打开文件句柄//参数1:文件路径//参数2:文件打开模式函数执行成功返回文件流指针,错误返回NULL。FILE*fopen(constchar*path,constchar*mode);模式操作区别文件要求r读…

    2022年6月2日
    42
  • UVa 414 – Machined Surfaces

    UVa 414 – Machined Surfaces题目:n个由X和空格组成的串,两边有至少一个X,将n个串压缩,每次每行消除一个空格,问到不能消除时剩余的空格。分析:简单题。统计全体空格数sum_b和最少空格数min_b,则结果就是sum_b-n*min_b。注意:利用gets或者getline读入串。#include#include#include#includeusingnamespacestd;

    2022年5月29日
    25
  • 最新版微信小程序如何引入iconfont阿里矢量图库解决方案

    最新版微信小程序如何引入iconfont阿里矢量图库解决方案前言:问题引发的原因来自最近在写微信小程序教学项目,项目中的一个图片是我随手切的,因为之前在Vue项目中一直在使用阿里矢量图库,我就想把阿里矢量图库ico图标集成到自己项目中,百度看了一些博客跟着做都引入不成功,研究了二十分钟弄出来,特此记录一下,同时作为参考文档供教学使用。1、首先我们打开阿里矢量官网接着我们需要登录一下,如果没有账号这里可以使用微博注册登录一下,登录成功后,点击【资源管理–>>我的项目】接着我们点击【新建项目】填写【项目名称:这里随便…

    2025年6月10日
    4
  • 认识ManualResetEvent

    认识ManualResetEventManualResetEvent可以通知一个或多个正在等待的线程已发生事件,允许线程通过发信号互相通信,来控制线程是否可以访问资源。当一个线程开始一个活动(此活动必须完成后,其他线程才能开始执行)时

    2022年7月4日
    27
  • springmvc的工作流程

    springmvc的工作流程1、springmvc工作原理图2、springmvc工作流程1、用户向服务端发送一次请求,这个请求会先到前端控制器DispatcherServlet(也叫中央控制器)。2、DispatcherServlet接收到请求后会调用HandlerMapping处理器映射器。由此得知,该请求该由哪个Controller来处理(并未调用Controller,只是得知)3、DispatcherServlet调用HandlerAdapter处理器适配器,告诉处理器适配器应该要去执行哪个Controlle

    2022年6月4日
    25

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号