2013金山西山居创意游戏程序挑战赛——初赛(3) 1001 生日猜猜猜 hdu 4551

来源:互联网 发布:蜜芽 知乎 编辑:程序博客网 时间:2024/05/21 10:20

生日猜猜猜

Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)
Total Submission(s): 0    Accepted Submission(s): 0


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
312 24 19923 70 19999 18 1999
 

Sample Output
Case #1: 1992/12/24Case #2: -1Case #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++);


}


}


//////////////////////上面代码太挫了,优化了一下

Accepted45510MS228K1584 BC++

#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++);


    }


}

原创粉丝点击