小明对生日十分看重,因为他可以得到祝福,可以和朋友亲人一起分享快乐,可以为自己的人生做一次总结,并且...能够收到好多礼物! 不过小明是个神秘的人,不会轻易告诉你他的生日,现在他想到一个办法,让你去猜他的生日是哪一天。 小明会告诉你如下三个信息: 1. 出生月份和出生日子的最大公约数; 2. 出生月份和出生日子的最小公倍数; 3. 出生年份; 现在要求你猜出小明的生日。
第一行输入一个正整数T,表示总共有T组册数数据(T <= 200); 对于每组数据依次输入三个数x,y,z, x表示出生月份和出生日子的最大公约数(1<= x <=1000); y表示出生月份和出生日子的最小公倍数(1<= y <=1000); z表示出生年份(1900 <= z <= 2013)。 每组输入数据占一行。
对于每组数据,先输出Case数。 如果答案不存在 ,输出“-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
#include<stdio.h>
//陷阱比较多,要判断这样的数字是否存在,存在时还要判断在这一年中是否有这一天
//若不止一天的话还要设置变量统计
int n,a,b,c,i,j,k,tt,kkk;
int mon1[]={0,31,28,31,30,31,30,31,31,30,31,30,31};//平年
int mon2[]={0,31,29,31,30,31,30,31,31,30,31,30,31};//闰年
int mmm,ddd;
void ff(int mm,int dd)//下面的代码有些啰嗦,将就着看吧
{
int num1=mm,num2=dd;
int aa,bb,temp;
if(num1<num2)//一下求最大公约数,最小公倍数
{
temp=num1;
num1=num2;
num2=temp;
}
aa=num1;
bb=num2;
while(bb!=0)
{
temp=aa%bb;
aa=bb;
bb=temp;
}
if(aa==a&&num1*num2/a==b)//判断 mm dd最大公约数 最小公倍数是否符合题意
{
if(c%4==0&&c%100!=0||c%400==0)//闰年
{ if(mon2[mm]>=dd)
{
if(kkk==0)//第一次时直接放入 mmm ddd,第二次以后不放入
{
mmm=mm;ddd=dd;
}
kkk++;
}
}
else if(mon1[mm]>=dd)//平年
{
if(kkk==0)
{
mmm=mm;ddd=dd;
}
kkk++;
}
}
}
int main()
{
int ll=1;
scanf("%d",&n);
while(n--)
{
scanf("%d%d%d",&a,&b,&c);
if(a*b>372||c<1900||c>2013||a>12)// 最小公倍数< 12月* 31天=372
{
printf("Case #%d: -1\n",ll++); continue;
}
tt=a*b;//两数乘积=最大公约数*最小公倍数
kkk=0;//符合条件的统计
for(i=a;i<=b&&i<=12;i++)//月份肯定大于最大公约数,小于最小公倍数,i=i+a也可以
if(tt%i==0&&tt/i<32)//
{
ff(i,tt/i);//判断月份i,天 tt/i的最大公约数最小公倍数是否相符
}
if(kkk>1) printf("Case #%d: 1\n",ll++);
else if(kkk==1)
{
printf("Case #%d: %d/%02d/%02d\n",ll++,c,mmm,ddd);
}
else if(kkk==0)
printf("Case #%d: -1\n",ll++);
}
}
//////////////////////上面代码太挫了,优化了一下
Accepted | 4551 | 0MS | 228K | 1584 B | C++ |
#include<stdio.h>
int n,a,b,c,i,j,k,tt,kkk;
int mon1[]={0,31,28,31,30,31,30,31,31,30,31,30,31};
int mon2[]={0,31,29,31,30,31,30,31,31,30,31,30,31};
int mmm,ddd;
void gongshu(int mm,int dd)
{
int num1=mm,num2=dd;
int temp;
if(num1<num2)
{
temp=num1;
num1=num2;
num2=temp;
}
while(num2!=0)
{
temp=num1%num2;
num1=num2;
num2=temp;
}
if(num1==a&&mm*dd/a==b)
{
if(c%4==0&&c%100!=0||c%400==0)
{
if(mon2[mm]>=dd)
{
if(kkk==0)
{
mmm=mm;
ddd=dd;
}
kkk++;
}
}
else if(mon1[mm]>=dd)
{
if(kkk==0)
{
mmm=mm;
ddd=dd;
}
kkk++;
}
}
}
int main()
{
int ll=1;
scanf("%d",&n);
while(n--)
{
scanf("%d%d%d",&a,&b,&c);
if(a*b>372||c<1900||c>2013||a>12)
{
printf("Case #%d: -1\n",ll++); continue;
}
tt=a*b;
kkk=0;
for(i=a;i<=b&&i<=12;i=i+a)
if(tt%i==0&&tt/i<32)
{
gongshu(i,tt/i);
}
if(kkk>1) printf("Case #%d: 1\n",ll++);
else if(kkk==1)
{
printf("Case #%d: %d/%02d/%02d\n",ll++,c,mmm,ddd);
}
else if(kkk==0)
printf("Case #%d: -1\n",ll++);
}
}