C语言练习题——当日天数
编程计算某年某月某日当天,是当年的第几天。 说明:1)当年1月1日是第1天;2)每月按月大,月小,闰年等情况,各月天数有不同(31,30,28,29);3)闰年按4年一闰,100年不闰,400年再闰计算。
输入格式:
用空格分隔的三个正整数(表示年,月,日的整数),均是合法的数据。
输出格式:
直接输出年-月-日:整数。表示当日是第几天。年号占4位,不足4位时补前导零,月和日各占2位,不足2位也补前导零。
输入样例1:
2020 3 3
输出样例:
2020-03-03:63
解题思路:这道题是根据自己输入的年月日,来判断当天是当年的第几天,这道题要做出来其实不难,但是我们很容易考虑不全,导致答案只是部分正确,我的思路是利用一个函数根据输入的年份和月份得到之前已经过完月份的总天数,再加上的当天的天数,就可以得出答案了。可以注意下面是我第一次的代码,
#include<stdio.h>
int main()
{
int day(int j,int t);
int n,k,s,p,y=0;
scanf("%d %d %d",&n,&s,&k);
for(p=1;p<s;p++)
{
y=y+day(p,n);
}
printf("%04d-%02d-%02d:%d",n,s,k,y+k);
}
int day(int j,int l)
{
int t=0;
if(j==1||j==3||j==5||j==7||j==8||j==10||j==12)
{
t=31;
}
else
{
if(j==4||j==6||j==9||j==11)
{
t=30;
}
else
{
if(l%4==0&&l%400==0&&l%100!=0)
t=29;
else
t=28;
}
}
return(t);
}
是部分正确的,原因是因为我在函数判断闰年的条件语句写错了,这也是我认为这道题最难的地方,一定要注意闰年的判断方法是“闰年按4年一闰,100年不闰,400年再闰计算”这不是一个并列的关系所以我上面写的if(l%4==0&&l%400==0&&l%100!=0)
是错误的。我们可以把他理解为年份被四可余,且被一百不可余算是闰年或者直接被400可余算是闰年两个条件,就得到
if(l%400==0||(l%4==0&&l%100!=00))
,用这个条件就可以准确判断闰年。
所以正确代码为:
#include<stdio.h>
int main()
{
int day(int j,int t);
int n,k,s,p,y=0;
scanf("%d %d %d",&n,&s,&k);
for(p=1;p<s;p++)
{
y=y+day(p,n);
}
printf("%04d-%02d-%02d:%d",n,s,k,y+k);
}
int day(int j,int l)
{
int t=0;
if(j==1||j==3||j==5||j==7||j==8||j==10||j==12)
{
t=31;
}
else
{
if(j!=2)
{
t=30;
}
else
{
if(l%400==0||(l%4==0&&l%100!=00))
t=29;
else
t=28;
}
}
return(t);
}
其他要注意的地方无非就是输出格式,和函数运用,以及条件是否考虑的周全这些问题。