首页 > ACM题库 > HDU-杭电 > HDU 4551-生日猜猜猜[解题报告]HOJ
2015
07-25

HDU 4551-生日猜猜猜[解题报告]HOJ

生日猜猜猜

问题描述 :

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

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

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

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

输入:

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

输出:

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

样例输入:

3
12 24 1992
3 70 1999
9 18 1999

样例输出:

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

点击打开链接

2A,两个队友都4A,5A。。。

#include"stdio.h"
int fun(int y,int m,int d)
{
	if(m==1||m==3||m==5||m==7||m==8||m==10||m==12)
	{
		if(d>=1&&d<=31)return 1;
		return 0;
	}
	else if(m==2)
	{
		if(d>=1&&d<=28)return 1;
		else if(d==29)
		{
			if(y%400==0||y%100!=0&&y%4==0)return 1;
			else return 0;
		}
		return 0;
	}
	else 
	{
		if(d>=1&&d<=30)return 1;
		return 0;
	}
}
int gcd(int x,int y)
{
	while(x>y?x%=y:y%=x);
	return x+y;
}
int main()
{
	int T,t;
	int a,b,y,m,d;
	int i,j,cnt;;
	t=1;
	scanf("%d",&T);
	while(T--)
	{
		scanf("%d%d%d",&a,&b,&y);
		cnt=0;
		for(i=1;i<=12;i++)
		{
			for(j=1;j<=31;j++)
			{
				if(!fun(y,i,j))continue;
				if(gcd(i,j)==a&&a*b==i*j)
				{
					if(cnt==0){m=i;d=j;}
					if(cnt>=2)break;
					cnt++;
				}
			}
			if(cnt>=2)break;
		}
		printf("Case #%d: ",t++);
		if(cnt==0)printf("-1\n");
		else if(cnt==1)printf("%d/%02d/%02d\n",y,m,d);
		else printf("1\n");
	}
	return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

参考:http://blog.csdn.net/yangyafeiac/article/details/8967139