关于闰年
1、公历中只分闰年和平年,平年二月28天,闰年二月29天,平年有365天,闰年共有366天(1-12月分别为31天,29天,31天,30天,31天,30天,31天,31,30天,31天,30天,31天)。
2、普通闰年:能被4整除但不能被100整除的年份为普通闰年。(如2004年就是闰年,1999年不是闰年);
世纪闰年:能被400整除的为世纪闰年。(如2000年是世纪闰年,1900年不是世纪闰年);
四年一闰,百年不闰,四百年再闰。 例如,2000年是闰年,2100年则是平年。
提交地址
https://www.nowcoder.com/questionTerminal/ccb7383c76fc48d2bbc27a2a6319631c
思路
一、最粗暴的方法:一天一天的累加。
//一天一天的累加
#include <stdio.h>
int month[2][15]={{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}}; //闰年、平年每个月份对应的日期
int judge (int a) {
if ((a%4==0&&a%100!=0)||a%400==0) return 1; //闰年返回1
else return 0;
} //判断是平年还是闰年
int main()
{
int a1, a2, year1, year2, month1, month2, day1, day2;
int temp, sum=0; //sum标记差多少天
scanf("%d %d", &a1, &a2); //scanf("%4d %2d %2d", &year1, &month1, &day1);这种写法可以直接获取年、月、日
if (a1>a2) {
temp=a1;
a1=a2;
a2=temp;
} //保证a1在前,a2在后。还有一种做法是让当前日期与0年1月1日比较,两个结果做差取绝对值
year1=a1/10000; month1=a1%10000/100; day1=a1%100; //20130127转化为2013 01 27
year2=a2/10000; month2=a2%10000/100; day2=a2%100;
//printf("%d %d %d %d %d %d\n", year1, month1, day1, year2, month2, day2); //测试代码
while(year1!=year2 || month1!=month2 || day1!=day2) {
if (day1<month[judge(year1)][month1]) day1++; //day1没满当月天数,day1加一天
else {
if (month1<12){ //月份没达到12,月份加一
day1=1;
month1++;
}else { //月份达到12,年加一
year1++;
month1=1;
day1=1;
}
}
sum++; //每循环一次,两个日期差值加一
//printf("%d %2d %2d %2d\n", year1, month1, day1, sum); //测试代码
}
//printf("%d\n", month[0][1]); //测试代码
printf("%d\n", ++sum);
}
二、先一年一年的加,再逐天累加。
//先一年一年的加,再逐天累加
#include <stdio.h>
int month[2][15]={{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}}; //闰年、平年每个月份对应的日期
int judge (int a) {
if ((a%4==0&&a%100!=0)||a%400==0) return 1; //闰年返回1
else return 0;
} //函数作用:判断是平年还是闰年
int main()
{
int a1, a2, year1, year2, month1, month2, day1, day2;
int temp, sum=0; //sum标记相差多少天
scanf("%d %d", &a1, &a2); //scanf("%4d %2d %2d", &year1, &month1, &day1);这种写法可以直接获取年、月、日
if (a1>a2) {
temp=a1;
a1=a2;
a2=temp;
} //保证a1在前,a2在后
year1=a1/10000; month1=a1%10000/100; day1=a1%100; //20130127转化为2013 01 27
year2=a2/10000; month2=a2%10000/100; day2=a2%100;
//printf("%d %d %d %d %d %d\n", year1, month1, day1, year2, month2, day2); //测试代码
while(year1<year2) {
if (a1%10000<=228) { //如果是2.28之前月份,总天数加多少取决于year1。注:此处不能写0228,不然会认为是8进制的数
if(judge(year1)==1) sum+=366;
else sum+=365;
}else { //如果是2.28之后月份,总天数加多少取决于year1+1
if(judge(year1+1)==1) sum+=366;
else sum+=365;
}
year1++;
} //将两个日期的年份统一
if(a1%10000<=a2%10000) { //将a1的年份拉至与a2的年份相同后,a1的日期在a2的前面
while(month1!=month2 || day1!=day2) { //a1的日期一天一天的累加,直到等于a2,此时总天数逐渐增加
if (day1<month[judge(year1)][month1]) {
day1++;
sum++;
}else { //日期累加到月底后,月份加1,日变为1号
month1++;
day1=1;
sum++;
}
}
}else { //将a1的年份拉至与a2的年份相同后,a1的日期在a2的后面
while(month1!=month2 || day1!=day2) { //a2的日期一天一天的累加,直到等于a1,此时总天数逐渐减少
if (day2<month[judge(year1)][month2]) {
day2++;
sum--;
}else {
month2++;
day2=1;
sum--;
}
}
}
//printf("%d\n", month[0][1]); //测试代码
printf("%d\n", ++sum); //测试代码
}
三、计算两个日期与0年1月1日得差值,两个值再做差。
#include <stdio.h>
int month[2][15]={{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}}; //闰年、平年每个月份对应的日期
int year[5]={365,366};
int judge (int a) {
if ((a%4==0&&a%100!=0)||a%400==0) return 1; //闰年返回1
else return 0;
} //判断是平年还是闰年
int gap(int a, int b, int c) {
int i, sum=0;
for (i=0; i<a; i++) sum+=year[judge(i)]; //a年的前一年到0年的天数
for (i=1; i<b; i++) sum+=month[judge(a)][i];
sum+=c;
return sum;
} //计算a年b月c日到0年1月1日的天数
int main()
{
int a1, a2, year1, year2, month1, month2, day1, day2;
int temp, sum=0; //sum标记差多少天
scanf("%d %d", &a1, &a2); //scanf("%4d %2d %2d", &year1, &month1, &day1);这种写法可以直接获取年、月、日
if (a1>a2) {
temp=a1;
a1=a2;
a2=temp;
} //保证a1在前,a2在后
year1=a1/10000; month1=a1%10000/100; day1=a1%100; //20130127转化为2013 01 27
year2=a2/10000; month2=a2%10000/100; day2=a2%100;
//printf("%d %d %d %d %d %d\n", year1, month1, day1, year2, month2, day2); //测试代码
sum=gap(year2, month2, day2)-gap(year1, month1, day1); //两个距离做差
printf("%d\n", ++sum);
}