首页 > 试题广场 >

日期差值

[编程题]日期差值
  • 热度指数:43248 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 64M,其他语言128M
  • 算法知识视频讲解
有两个日期,求两个日期之间的天数,如果两个日期是连续的我们规定他们之间的天数为两天

输入描述:
有多组数据,每组数据有两行,分别表示两个日期,形式为YYYYMMDD


输出描述:
每组数据输出一行,即日期差值
示例1

输入

20110412
20110422

输出

11
我真的醉了,调试了老半天,原来是输入格式的问题,牛客真的有毛病啊,两分钟做完这个题目,调了半小时。醉了。
int isLeapYear(int year) 
{
    if(((year % 4 == 0) && (year % 100 != 0)) || year % 400 ==0)
        return 1;
    else
        return 0;
}
int sincebefore(int year,int month,int day) 
{
    int days = 0;
    for(int i = 1; i< year; ++i) 
    {
        days += isLeapYear(i) ? 366 : 365;
    }
    int monthDays[13] = {0,31,28,31,30,31,30,31,31,30,31,30,31};
    for(int i = 1; i< month; ++i) 
    {
        if(i == 2 && isLeapYear(year)) 
        {
            days += 29;
        }
        else
        {
            days += monthDays[i];
        }
    }
    days += day;
    return days;
}
int main() 
{
    int year1,month1,day1;
    int year2,month2,day2;
    scanf("%4d%2d%2d",&year1,&month1,&day1); //这里的格式
    scanf("%4d%2d%2d",&year2,&month2,&day2);
    //这里的格式必须是这样,因为年占4个位置,月占2,天也是2
    int days1 = sincebefore(year1,month1,day1);
    int days2 =  sincebefore(year2,month2,day2);
    int day = days1 > days2 ? days1 - days2 +1 : days2 -days1+1;
    printf("%d\n", day) ;
    return 0;
}


发表于 2024-07-20 17:14:43 回复(0)
#include <stdio.h>
#include <stdbool.h>

void nextDay(int *year, int *month, int *day) {
	bool isLeap = (*year % 400 == 0) || (*year % 4 == 0 && *year % 100 != 0);
	int dayOfMonth[13] = { 0,31,28,31,30,31,30,31,31,30,31,30,31 };
	if (isLeap)	dayOfMonth[2] = 29;
	(*day)++;
	if (*day > dayOfMonth[*month]) {
		*day = 1;
		(*month)++;
	}
	if (*month > 12) {
		*month = 1;
		(*year)++;
	}
}

int main(void) {
	int year1, month1, day1;
	int year2, month2, day2;

	// printf("请输入两个年、月、日,输出两个日期的差值\n");
	scanf("%4d%2d%2d", &year1, &month1, &day1);
	scanf("%4d%2d%2d", &year2, &month2, &day2);
	
	int count = 1;
	while(!(year1==year2 && month1==month2 && day1==day2)) {
		nextDay(&year1, &month1, &day1);
		count++;
	}
	printf("%d\n", count);

	return 0;
}

发表于 2024-04-25 09:12:31 回复(0)
这样做不知道对不对,求大神指点。
我的前提:先输入的日期year1比后输入的日期year2早。
我的思路:如果两个日期年份不等,将日期分成三段,year1距离该年末尾的天数,year2距离年头的天数,夹在中间几年的天数,最后+1。
如果日期年份相等,year2距离年头的天数减去year1距离年头的天数,最后+1。
#include <stdio.h>
#include <stdbool.h>

int daytab[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},
};

bool IsLeapYear(int year) {
    return (year % 100 != 0 && year % 4 == 0) || (year % 400 == 0);
}

int NumberOfYear(int year) {
    if (IsLeapYear(year)) {
        return 366;
    } else {
        return 365;
    }
}

int NumberOfDate(int year, int month, int day) {
    int row = IsLeapYear(year);
    int number = 0;
    for (int i = 0; i < month; i++) {
        number += daytab[row][i];
    }
    number += day;
    return number;
}

int main() {
    int year1, month1, day1;
    int year2, month2, day2;
    int number;
    while (scanf("%04d%02d%02d\n%04d%02d%02d", &year1, &month1, &day1, &year2,&month2,&day2) != EOF) {
        if (year1 != year2) {
            number = NumberOfYear(year1) - NumberOfDate(year1, month1, day1);
            number += NumberOfDate(year2, month2, day2);
            int a = year2 - year1;
            for (int i = 1; i < a; i++) {
                number += NumberOfYear(year1 + a);
            }
        } else {
            number = NumberOfDate(year2, month2, day2) - NumberOfDate(year1, month1, day1);
        }
        printf("%d\n", number + 1);
    }
    return 0;
}


发表于 2023-02-27 14:41:20 回复(0)
#include <stdio.h>

int daytab[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}
};
_Bool IsLeapYear(int year){
    return (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0);
}
int NumberOfYear(int year){
    if(IsLeapYear(year)){
        return 366;
    }else {
        return 365;
    }
}
int main() {
    int year1,month1,day1; 
    int year2,month2,day2; 
    int n1,n2;
    while(scanf("%d%d",&n1,&n2)!=EOF){
        if(n1<n2){
            int temp=n1;
            n1=n2;
            n2=temp;
        }
        year1=n1/10000;
        month1=n1/100%100;
        day1=n1%100;
        year2=n2/10000;
        month2=n2/100%100;
        day2=n2%100;
        int sum1=0,sum2=0;
        int row;
        row=IsLeapYear(year1);
        for(int i=0;i<month1;i++){
            sum1+=daytab[row][i];
        }
        
        sum1=day1+sum1;
        row=IsLeapYear(year2);
        for(int i=0;i<month2;i++){
             sum2+=daytab[row][i];
        }
       sum2+=day2;
        int count=0;
        count=sum1-sum2+1;
        while(year1>year2){
            count+=NumberOfYear(year1);
            year1--;
        } 
        printf("%d\n",count);   
    }
    return 0;
}

发表于 2023-02-01 23:45:10 回复(0)

问题信息

难度:
7条回答 14917浏览

热门推荐

通过挑战的用户

查看代码
日期差值