生日猜猜猜
不过小明是个神秘的人,不会轻易告诉你他的生日,现在他想到一个办法,让你去猜他的生日是哪一天。
小明会告诉你如下三个信息:
1. 出生月份和出生日子的最大公约数;
2. 出生月份和出生日子的最小公倍数;
3. 出生年份;
现在要求你猜出小明的生日。
对于每组数据依次输入三个数x,y,z,
x表示出生月份和出生日子的最大公约数(1<= x <=1000);
y表示出生月份和出生日子的最小公倍数(1<= y <=1000);
z表示出生年份(1900 <= z <= 2013)。
每组输入数据占一行。
如果答案不存在 ,输出“-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
C++实现如下代码所示:
/*
Author:Emily Wang
*/
#include "stdafx.h"
#include<iostream>
using namespace std;
int mcp(int x,int y);
int tcl(int x,int y);
int _tmain(int argc, _TCHAR* argv[])
{
int T;
int kcase = 1;
bool leapYear = false;
cout<<"请输入一个不大于200的正整数:"<<endl;
cin>>T;
while(T--)
{
int x,y,z;
int year,month,day;
cin>>x>>y>>z;
if((z%4==0&&z%100!=0)||z%400==0)
{
leapYear = true;
}
int sum = 0;
for(int i = 1;i <= 12;++i)
{
if(i == 2)
{
if(leapYear)
{
for(int j = 1;j <= 29;++j)
{
if(mcp(i,j)==x&&tcl(i,j)==y)
{
year = z;
month = i;
day = j;
sum ++;
goto here;
}
}
}else
{
for(int j = 1;j <= 28;++j)
{
if(mcp(i,j)==x&&tcl(i,j)==y)
{
year = z;
month = i;
day = j;
sum ++;
if(sum > 1)
goto here;
}
}
}
}
else
{
if(i==1||i==3||i==5||i==7||i==8||i==10||i==12)
{
for(int j = 1;j <= 31;++j)
{
if(mcp(i,j)==x&&tcl(i,j)==y)
{
year = z;
month = i;
day = j;
sum ++;
if(sum > 1)
goto here;
}
}
}
else
{
for(int j = 1;j<=30;++j)
{
if(mcp(i,j)== x&&tcl(i,j)== y)
{
year = z;
month = i;
day = j;
sum++;
if(sum > 1)
goto here;
}
}
}
}
}
here:
if(sum==1)
{
cout<<"Case #"<<kcase++<<": "<<year<<"/ "<<month<<"/ "<<day<<endl;
}
else if(sum>1)
{
cout<<"Case #%d:"<<kcase++<<"1"<<endl;
}
else
{
cout<<"Case #%d:"<<kcase++<<"-1"<<endl;
}
}
system("pause");
return 0;
}
//求最大公约数
int mcp(int x,int y)
{
int tmp;
while(y>0)
{
tmp = y;
y = x%y;
x = tmp;
}
return x;
}
//求出最小公倍数
int tcl(int x,int y)
{
return x*y/mcp(x,y);
}