ACM之金山西山居创意游戏程序挑战赛-初赛

生日猜猜猜

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

 

 

 

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);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值