前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >生理周期

生理周期

作者头像
AI那点小事
发布2020-04-20 16:51:21
3580
发布2020-04-20 16:51:21
举报
文章被收录于专栏:AI那点小事AI那点小事
代码语言:javascript
复制
人有体力、情商、智商的高峰日子,它们分别每隔 23天、28天和33天出现一次。对于每个人,我们想 知道何时三个高峰落在同一天。给定三个高峰出现 的日子p,e和i(不一定是第一次高峰出现的日子), 再给定另一个指定的日子d,你的任务是输出日子d 之后,下一次三个高峰落在同一天的日子(用距离d 的天数表示)。例如:给定日子为10,下次出现三 个高峰同一天的日子是12,则输出2。 

代码语言:javascript
复制
输入   
 输入四个整数:p, e, i和d。 p, e, i分别表示体力、情感和 智力高峰出现的日子。d是给定的日子,可能小于p, e或 i。 所有给定日子是非负的并且小于或等于365,所求的日子小于 或等于21252。 

代码语言:javascript
复制
 输出  
 从给定日子起,下一次三个高峰同一天的日子(距离给定日子 的天数)。 

代码语言:javascript
复制
**解题思路**
    从d+1天开始,一直试到第21252 天,对其中每个日期k,看 是否满足 
 (k – p)%23 == 0 && (k – e)%28 == 0 &&     (k-i)%33 == 0 
 但是上述方法太慢了,可以跳着试!
 就是先找出体力高峰日,在此基础上找情商高峰日,再找智商高峰日即可。

输入样例 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.


代码如下:

代码语言:javascript
复制
import java.util.Scanner;

public class Main {

    //a与 b的最大公约数
    public static int GCD(int a,int b){
        int gcd;
        while (b != 0){
            gcd = a % b;
            a = b;
            b = gcd;
        }
        gcd = a;
        return gcd;
    }

    //a与b的最小公倍数
    public static int GCM(int a,int b){
        int tmp1 = a;
        int tmp2 = b;
        int gcd = GCD(tmp1,tmp2);
        int gcm = a * b / gcd;
        return gcm;
    }

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Scanner in = new Scanner(System.in);
        int p,i,e,d;
        int caseNO = 0;
        while(true){
            p = in.nextInt();
            e = in.nextInt();
            i = in.nextInt();
            d = in.nextInt();
            if (p == -1){
                break;
            }else{
                caseNO++;
                int k;
                for (k = d+1 ; (k-p) % 23 != 0; k++);
                for (; (k-e) % 28 != 0 ; k += 23);
                for (; (k-i) % 33 != 0 ; k += GCM(23,28));
                System.out.printf("Case %d: the next triple peak occurs in %d days.\n",caseNO,k-d);
            }
        }
        in.close();
    }
}
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档