日历问题

日历问题

在我们现在使用的日历中。闰年被定义为能被4整除的年份,但是能被100整除而不能被400整除的年是例外,它们不是闰年。例如:1700, 1800, 1900 和 2100 不是闰年,而 1600, 2000 和 2400是闰年。 给定从公元2000年1月1日开始逝去的天数,你的任务是给出这一天是哪年哪月哪日星几。
输入数据
输入包含若干行,每行包含一个正整数,表示从2000年1月1日开始逝去的天数。输入最后一行是−1, 不必处理。可以假设结果的年份不会超过9999。
输出要求
对每个测试样例,输出一行,该行包含对应的日期和星期几。格式为“YYYY-MM-DD DayOfWeek”, 其中 “DayOfWeek” 必须是下面中的一个: “Sunday”,“Monday”,“Tuesday”,“Wednesday”,“Thursday”, “Friday” and “Saturday“。
代码
#include <stdio.h>
int type(int);
char week[7][10]={“Saturday”,“Sunday”,“Monday”,“Tuesday”,“Wednesday”,“Thursday”,“Friday”};
int year[2]={365,366};
int month[2][12]={31,28,31,30,31,30,31,31,30,31,30,31,31,29,31,30,31,30,31,31,30,31,30,31};
int main(){
int days,dayofweek;
int i=0,j=0;
while((scanf(”%d"),&days)&&days!=-1){
dayofweek=days;
for(j=0;days>=year[type(i)];i++)
days-=year[type(i)];
for(j=0;days>=month[type(i)][j];j++)
days-=month[type(i)][j];
printf("%d-%02d-%02d%s\n",i,j+1,days+1,week[dayofweek]);
}
}
int type(int m){
if(m%4!=0||(m%100==0&&m%400!=0))
return 0;
else return 1;
}
分析
两个问题:
(1)一个是要求的那天是星期几。
用给定的日期对7取模。
(2)另一是要求的那天是哪年哪月哪天。
用year, month, day分别表示要求的日期的年、月、日。当输入一个整数n时,如果n大于等于一年的天数,就用n减去一年的天数,直到n比一年的天数少(这时假设剩下天数为m),一共减去多少年year就等于多少;如果m大于等于一个月的天数,就用m减去一个月的天数,直到
m比一个月的天数少(这时假设剩下的天数为k),一共减去多少个月month就等于多少;这时k为从当月开始逝去的天数,k+1就是要求的day。这里减去一年的天数时要判断当年是否是闰年,减去一月时要判断当月有几天。
总结
(1)%d表示将数字按宽度为2,采用右对齐方式输出,若数据位数不到2位,则左边补0。
(2)先给出所有的闰年非闰年的天数以及星期几,然后用函数调用返回值去实现,会使程序比较简化。
(3)我个人认为程序没有出错,但输出结果不正确。希望大家帮忙修改一下代码,发现错误后我会再次修改。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值