hdu4551

生日猜猜猜

Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)
Total Submission(s): 800    Accepted Submission(s): 299


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

小明会告诉你如下三个信息:

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

现在要求你猜出小明的生日。
 
Input
第一行输入一个正整数T,表示总共有T组册数数据(T <= 200);
对于每组数据依次输入三个数x,y,z,
x表示出生月份和出生日子的最大公约数(1<= x <=1000);
y表示出生月份和出生日子的最小公倍数(1<= y <=1000);
z表示出生年份(1900 <= z <= 2013)。
每组输入数据占一行。
 
Output
对于每组数据,先输出Case数。
如果答案不存在 ,输出“-1”;
如果答案存在但不唯一 ,输出“1”;
如果答案唯一,输出生日,日期格式为YYYY/MM/DD;
每组输出占一行,具体输出格式参见样例。
 
Sample Input
3
12 24 1992
3 70 1999
9 18 1999
 
Sample Output
Case #1: 1992/12/24
Case #2: -1
Case #3: 1999/09/18
 
 
Source
 
 
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
using namespace std;
int runnian(int y)
{
    if(y%4==0&&y%100!=0||y%400==0)
        return 1;
    return 0;
}
int gcd(int x,int y)
{
    return y==0?x:gcd(y,x%y);
}
int main()
{
    int n,m,p,num=1,t,s,mon,day,i,j,cnt;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d%d%d",&n,&m,&p);
        s=n*m;
        cnt=0;
        for(i=1; i<=12; i++)
        {
            if(i==1||i==3||i==5||i==7||i==8||i==10||i==12)
                for(j=1; j<=31; j++)
                {
                    if(gcd(i,j)==n&&s==i*j)
                    {
                        mon=i;
                        day=j;
                        cnt++;
                    }
                }
            else if(i==4||i==6||i==9||i==11)
                for(j=1; j<=30; j++)
                {
                    if(gcd(i,j)==n&&s==i*j)
                    {
                        mon=i;
                        day=j;
                        cnt++;
                    }
                }
            else if(i==2&&runnian(p)==1)
                for(j=1; j<=29; j++)
                {
                    if(gcd(i,j)==n&&s==i*j)
                    {
                        mon=i;
                        day=j;
                        cnt++;
                    }
                }
                else if(i==2&&runnian(p)==0)
                for(j=1; j<=28; j++)
                {
                    if(gcd(i,j)==n&&s==i*j)
                    {
                        mon=i;
                        day=j;
                        cnt++;
                    }
                }
        }
        printf("Case #%d: ",num++);
        if(cnt==1)
            printf("%d/%02d/%02d ",p,mon,day);
        else if(cnt==0)
            printf("-1 ");
        else if(cnt>1)
            printf("1 ");
    }
}
原文地址:https://www.cnblogs.com/lxm940130740/p/3330547.html