您的位置:首页 > 其它

HDU4551(平润年+最小公约数+最大公倍数)

2013-05-19 15:39 288 查看

生日猜猜猜

[b]Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)

Total Submission(s): 349    Accepted Submission(s): 138
[/b]

[align=left]Problem Description[/align]
小明对生日十分看重,因为他可以得到祝福,可以和朋友亲人一起分享快乐,可以为自己的人生做一次总结,并且...能够收到好多礼物!

不过小明是个神秘的人,不会轻易告诉你他的生日,现在他想到一个办法,让你去猜他的生日是哪一天。

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

1. 出生月份和出生日子的最大公约数;

2. 出生月份和出生日子的最小公倍数;

3. 出生年份;

现在要求你猜出小明的生日。
 

[align=left]Input[/align]
第一行输入一个正整数T,表示总共有T组册数数据(T <= 200);

对于每组数据依次输入三个数x,y,z,

x表示出生月份和出生日子的最大公约数(1<= x <=1000);

y表示出生月份和出生日子的最小公倍数(1<= y <=1000);

z表示出生年份(1900 <= z <= 2013)。

每组输入数据占一行。
 

[align=left]Output[/align]
对于每组数据,先输出Case数。

如果答案不存在 ,输出“-1”;

如果答案存在但不唯一 ,输出“1”;

如果答案唯一,输出生日,日期格式为YYYY/MM/DD;

每组输出占一行,具体输出格式参见样例。
 

[align=left]Sample Input[/align]

3
12 24 1992
3 70 1999
9 18 1999

 

[align=left]Sample Output[/align]

Case #1: 1992/12/24
Case #2: -1
Case #3: 1999/09/18 //简单的日期处理,平润年、最小公约数与最大公倍数的处理#include<iostream>
using namespace std;

int month[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
bool is_leap(int year)
{
 if((year%4==0&&year%100)||(year%400==0))
  return true;
 else return false;
}
int fun(int a,int b)
{
 while(a!=b)
 {
  if(a>b)
   a=a-b;
  else b=b-a;
 }
 return a;
}

int main()
{
 int t,x,y,z;
 int i,j;
 int day,mon;
 int  tag=0;
 int flag;
 cin>>t;
 while(t--)
 {
  scanf("%d%d%d",&x,&y,&z);
  flag=0;
  printf("Case #%d: ",++tag);
  for(i=x;i<=12;i++)
  {
   if(x*y%i==0)
   {
    j=x*y/i;
    if(fun(i,j)==x&&(i!=2&&j<=month[i])||(i==2&&is_leap(z)&&j<=month[i]+1)||(i==2&&!is_leap(z)&&j<=month[i]))
    {
     day=j;
     mon=i;
     flag++;
    }
   }
  }
  if(flag==0)
   printf("-1\n");
  else if(flag==1)
   printf("%d/%02d/%02d\n",z,mon,day);
  else
  {
  // printf("%d/%02d/%02d\n",z,mon,day);
   printf("1\n");
  }
 }
 return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  模拟 日期