满意答案
//没有处理输入数据为公元前某天的情况,可循环输入,结束程序按ctrl+z确认即可
#include
#include #define lev(n) (n % 4 == 0 && (n % 100 != 0 || n % 400 == 0))//闰年则为1,非闰年则为0int main(void)
{
int y, m, d, l, i, s, flag;
int month[2][13] = {
{0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31},
{0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}
}; while (scanf("%d/%d/%d", &y, &m, &d) != EOF)
{
if(y<1||y>=2000||m<1||m>12||d<1) {
//由于公元纪年的起点是公元1年,而没有“公元0年”,也没有包括2000年1月1日这一天
printf("输入不在1年1月1日到2000年1月1日之间,请重新输入!\n");
continue;
}
l = lev(y);
for (s = 0, i = 1 ; i < m ; i++)
s += month[l][i];
if(d > month[l][m])
{
printf("输入的日期超出月份所拥有的范围,请重新输入!\n");
continue;
}
else s += d;//表示该日期是该年的第几天
if(l)s = 366 - s;
else s = 365 - s;
flag = 2000 - y - 1;
if(flag==0)s = s;
else if(flag<400)s = (flag/4)*366 - flag/100 + (flag-flag/4)*365 + s;
else if(flag<800)s = (flag/4)*366 - flag/100 + 1 + (flag-flag/4)*365 + s;
else if(flag<1200)s = (flag/4)*366 - flag/100 + 2 + (flag-flag/4)*365 + s;
else if(flag<1600)s = (flag/4)*366 - flag/100 + 3 + (flag-flag/4)*365 + s;
else s = (flag/4)*366 - flag/100 + 4 + (flag-flag/4)*365 + s;
printf("%d年%d月%d日到2000年1月1日之间的间隔天数为%d\n", y, m, d, s);
} return 0;
}
03分享举报