题目描述:给出年份(XXXX格式)和总天数(大于等于0的整数),求出对应月份,输入多组数据,以0 0结束。比如:输入2014 32->输出2
常规思维是用12个if...break分支语句,这样一来代码就会变的很长,而且重复率高,没有美感。
新的思路是,将每个月的天数存在一个数组里,然后设置一个累加变量sum,这个变量存从1月到第i+1个月的总天数,如果day小于等于sum,就输出数组对应的下标。
如此,代码就变的短巧美观多了:
/*由年份和总天数求出对应年份*/
/*以输入0 0结束*/
#include<stdio.h>
#include<stdlib.h>
int IsLeap(int y)
{
if(y%400==0)/*能被400整除*/
{
return 1;
}
if(y%4==0&&y%100!=0)/*或者能被4整除但不能被100整除*/
{
return 1;
}
else
return 0;
}
int main()
{
int year,month,day;
while(scanf("%d %d",&year,&day)&&(year!=0||day!=0))
{
int monthDayLeap[12]={31,29,31,30,31,30,31,31,30,31,30,31};/*闰年*/ /*用一个数组表示每个月的天数*/
int monthDay[12]={31,28,31,30,31,30,31,31,30,31,30,31}; /*非闰年*/
int sum;
if(IsLeap(year))
{ sum=0;
for(int i=0;i<12;i++)
{
if(day<=sum)
{
printf("%d\n",i);/*下标记录月份*/
break;
}
else{
sum=sum+monthDayLeap[i];
}
}
}
else{
sum=0;
for(int j=0;j<12;j++)
{
if(day<=sum)
{
printf("%d\n",j);
break;
}
else{
sum=sum+monthDay[j];
}
}
}
}
return 0;
}
运行结果: