题目求助|一道关于lcm和gcd的数学题
3670
2021.06.30
2021.06.30
发布于 未知归属地

题目描述

PIPI十分看重自己的生日,因为他可以得到祝福,可以和朋友亲人一起分享快乐,可以为自己的人生做一次总结,并且...能够收到好多礼物!
不过PIPI是个神秘的人,不会轻易告诉你他的生日,现在他想到一个办法,让你去猜他的生日是哪一天。

PIPI会告诉你如下三个信息:

  1. 出生月份和出生日子的最大公约数;
  2. 出生月份和出生日子的最小公倍数;
  3. 出生年份;

现在要求你猜出PIPI的生日。

输入

第一行输入一个正整数T,表示总共有T组册数数据(T <= 200);
对于每组数据依次输入三个数x,y,z,
x表示出生月份和出生日子的最大公约数(1<= x <=1000);
y表示出生月份和出生日子的最小公倍数(1<= y <=1000);
z表示出生年份(1900 <= z <= 2019)。
每组输入数据占一行。

输出

对于每组数据,输出样例如下:
如果答案不存在 ,输出“-1”;
如果答案存在但不唯一 ,输出“1”;
如果答案唯一,输出生日,日期格式为YYYY/MM/DD;
每组输出占一行,具体输出格式参见样例。

样例输入

3
12 24 1992
3 70 1999
9 18 1999

样例输出

Case #1: 1992/12/24
Case #2: -1
Case #3: 1999/09/18

说明

自己写的错了60%,想不到哪里错了。想法很简单,就是按最大公约数的倍数枚举月份和日,找出满足lcm*gcd = 月 * 日的。哪位大佬随便看眼,指出我的错误

代码

#include <bits/stdc++.h>
using namespace std;
 
// 0:平年   1:闰年
int days[2][12] = {31,28,31,30,31,30,31,31,30,31,30,31,
                   31,29,31,30,31,30,31,31,30,31,30,31};
 
 
 
int main(){
    int t;
    scanf("%d",&t);
    int caseNum = 0;
    while(t--){
        caseNum++;
        int x,y,z;
        int resMonth,resDay;
        scanf("%d %d %d",&x,&y,&z);
        int flag = 0;   // 0:平年 1:闰年
        if((z % 4 == 0 && z % 100 != 0) || z % 400 == 0)    flag = 1;
        if(y % x != 0){
            printf("Case #%d: -1\n",caseNum);
            continue;
        }
        int cnt = 0;    // 记录可能的结果数
        // 枚举x的倍数
        for(int month = x;month <= 12;month += x){
            for(int day = x;day <= days[flag][month-1];day += x){
                if(x*y == month*day){
                    cnt++;
                    resMonth = month;
                    resDay = x*y/month;
                }
            }
        }
        if(cnt < 1) printf("Case #%d: -1\n",caseNum);
        else if(cnt == 1) printf("Case #%d: %d/%02d/%02d\n",caseNum,z,resMonth,resDay);
        else    printf("Case #%d: 1\n",caseNum);
    }
    return 0;
}
评论 (8)