关键点
判断一个年份是不是闰年,实现日期增长时月份,年份的增加。本篇文章整理一些codeup上的编程问题。
1
思路分析
两个不同日期做差值可能遇到的问题很多,例如中间会遇到多少个闰年,做差的两个月是不是闰年,计算的日期有没有二月份?
个人觉得直接让两个日期做差逻辑比较复杂,可以采用的方法是让小的日期逐天相加一直加到大的日期,这样计算差值时就看循环的次数就行了。
#include<stdio.h>
_Bool isLeap(int year);
int main()
{
int a[13][2] = {
{0,0},
{31,31},{28,29},{31,31},{30,30},
{31,31},{30,30},{31,31},{31,31},
{30,30},{31,31},{30,30},{31,31}
};
int first,second,temp; //first记录第一个输入的日期 ,second记录第二个输入的日期
int day1,day2,month1,month2,year1,year2; //分别用于记录两个日期的年月日
int days; //记录两个日期的差值
while(scanf("%d%d",&first,&second) == 2)
{
days = 1;
//确保first中的日期是较小的
if(first > second){
temp = first;
first = second;
second = temp;
}
day1 = first % 100;
day2 = second % 100;
month1 = first / 100 % 100;
month2 = second / 100 % 100;
year1 = first / 10000;
year2 = second / 10000;
while(year1 < year2 || month1 < month2 || day1 < day2)
{
day1++;
if(day1 == a[month1][isLeap(year1)] + 1)
{
day1 = 1;
month1++;
if(month1 == 13){
month1 = 1;
year1++;
}
}
days++;
}
printf("%d\n",days);
}
return 0;
}
_Bool isLeap(int year)
{
return (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0);
}
Tips
- 注意判断闰年的逻辑,在isLeap函数中,这个涉及到日期题大多都会考到;
- 关于闰年平年每个月有多少天的问题,选择用一个二维数组来记录,行号代表月份,
列号代表平闰。 - 关于年份,月份,日期的提取方法值得注意。除法(右移),取余(保留指定位数)。
2
这题的大意就是输出指定的日期,输出对应日期是星期几.
思路分析
将对应年份的总天数求出来,然后对7求模。
#include <stdio.h>
#include <string.h>
_Bool isLeap(int year);
int main()
{
const char * months[13] = {"","January","February","March","April",
"May","June","July","August",
"September","October","November","December"};
const char *weeks[7] = {"Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"};
int a[13][2] = {
{0,0},
{31,31},{28,29},{31,31},{30,30},
{31,31},{30,30},{31,31},{31,31},
{30,30},{31,31},{30,30},{31,31}
};
int day,year,month;
int i;
char temp[10];
unsigned long long days;
while(scanf("%d%s%d",&day,temp,&year) == 3){
days = 0;
for(i = 1; i <= 12;i++)
{
if(!strcmp(months[i],temp)) {
month = i;
break;
}
}
for(i = 1; i < year;i++)
{
if(isLeap(i))
days += 366;
else
days += 365;
}
for(i = 1;i < month;i++)
{
days += a[i][isLeap(year)];
}
days += day;
printf("%s\n",weeks[days % 7]);
} return 0;
}
_Bool isLeap(int year)
{
return (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0);
}
3
思路分析
从对应年份的一月一号开始,逐天增加,直到所要加的天数为0。
注意打印格式要用固定位数,不足的用0补齐
#include <stdio.h>
_Bool isLeap(int year);
int main()
{
int a[13][2] = {
{0,0},
{31,31},{28,29},{31,31},{30,30},
{31,31},{30,30},{31,31},{31,31},
{30,30},{31,31},{30,30},{31,31}
};
int y,n;
int flag;
int days,month;
while(scanf("%d%d",&y,&n) == 2){
days = 0;
month = 1;
while(n){
flag = isLeap(y); // 判断是否是闰年
days++;
n--;
if(a[month][flag] + 1 == days){
days = 1;
month++;
}
}
printf("%04d-%02d-%02d\n",y,month,days);
}
return 0;
}
_Bool isLeap(int year)
{
return (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0);
}