本大师来了~
分支:问题 K: 【C1】【多分支】【课外】求年月
题目描述
输入年份和这一年的第几天,输出具体的年、月、日的信息。(注意闰年的判断!)
输入
输入两个整数分别代表年份和这一年的第几天。(假设数据都在有效范围内)
输出
输出对应的年、月、日。输出的数字之间以一条横线间隔,输出完毕换行。
样例输入
2011 20
样例输出
2011-1-20
提示
非闰年,区分第31天、第59天、第90天、第120天、151天、181天、212天、243天、第273天、第304天、334天。
闰年的话,相应调整。
如果学过数组,比较容易。
没学过数组,用多个if一一枚举,也是可以的。
思路分析
讨论点:年份为闰年时二月份的天数不一样,为29;每个月份的天数不一样。
一、耐心进行情况讨论,全部用 if 分支实现
#include<stdio.h>
int main()
{
int a,b,c,d;
scanf("%d %d",&a,&b);
if(((a%4==0)&&(a&100!=0))||(a%400==0))
{
if(b<32)
{
d=1;
c=b;
}
if((b>31)&&(b<61))
{
d=2;
c=b-31;
}
if((b>60)&&(b<92))
{
d=3;
c=b-60;
}
if((b>91)&&(b<122))
{
d=4;
c=b-91;
}
if((b>121)&&(b<153))
{
d=5;
c=b-121;
}
if((b>152)&&(b<183))
{
d=6;
c=b-152;
}
if((b>182)&&(b<214))
{
d=7;
c=b-182;
}
if((b>213)&&(b<245))
{
d=8;
c=b-213;
}
if((b>244)&&(b<275))
{
d=9;
c=b-244;
}
if((b>274)&&(b<306))
{
d=10;
c=b-274;
}
if((b>305)&&(b<336))
{
d=11;
c=b-305;
}
if((b>335)&&(b<367))
{
d=12;
c=b-335;
}
}
else
{
if(b<32)
{
d=1;
c=b;
}
if((b>31)&&(b<60))
{
d=2;
c=b-31;
}
if((b>59)&&(b<91))
{
d=3;
c=b-59;
}
if((b>90)&&(b<121))
{
d=4;
c=b-90;
}
if((b>120)&&(b<152))
{
d=5;
c=b-120;
}
if((b>151)&&(b<182))
{
d=6;
c=b-151;
}
if((b>181)&&(b<213))
{
d=7;
c=b-181;
}
if((b>212)&&(b<244))
{
d=8;
c=b-212;
}
if((b>243)&&(b<274))
{
d=9;
c=b-243;
}
if((b>273)&&(b<305))
{
d=10;
c=b-273;
}
if((b>304)&&(b<335))
{
d=11;
c=b-304;
}
if((b>334)&&(b<366))
{
d=12;
c=b-334;
}
}
printf("%d-%d-%d",a,d,c);
return 0;
}
二、需掌握数组和循环
1)用空间为12的数组来存储每个月份的对应天数,由于数组下标是从0开始的,我们用下标0表示1月份,下标1表示2月份...
2)在循环里做减法使day控制在一个月份天数以内,同时通过 i 进行月份记录
#include<stdio.h>
main()
{
int year,day,i=0;
int month[12]={31,28,31,30,31,30,31,31,30,31,30,31};
//用于存储每个月的天数
scanf("%d %d",&year,&day);
if(year % 4 == 0 && year % 100 != 0 || year % 400 == 0)
month[1]=29;//如果是闰年则改变2月份的天数
while(i<12&&day>month[i])
day-=month[i++];
printf("%d-%d-%d",year,i+1,day);
}