首页 > 试题广场 >

日期累加

[编程题]日期累加
  • 热度指数:49252 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解
设计一个程序能计算一个日期加上若干天后是什么日期。

输入描述:
输入第一行表示样例个数m,接下来m行每行四个整数分别表示年月日和累加的天数。


输出描述:
输出m行,每行按yyyy-mm-dd的个数输出。
示例1

输入

1
2008 2 3 100

输出

2008-05-13
#include<stdio.h>
#include<stdbool.h>
#include<string.h>
#include<math.h>/*输入第一行表示样例个数接下来的m行中,每行4个整数,分别表示年、月、日和累加的天数。
输出:
输出m行,每行按yyyy-mm-dd的个数输出。
样例输入:
1
2008 2 3 100
样例输出:
2008-05-13*/

int IsRUN(int y){
    if((y%4==0&&y%100!=0)||(y%400==0))
        return 1;
    else
        return 0;
}
int a[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}};


int nian(int y){
    if(IsRUN(y)==1)
        return 366;
    else
        return 365;

}
int main(){
    int m,i,y,n,d,sum=0,s,m1;
    scanf("%d",&n);
    while(n--){
    scanf("%d%d%d%d",&y,&m,&d,&s);
    int row=IsRUN(y);
    for(i=0;i<m;i++){
        sum+=a[row][i];
    }
    sum=sum+d+s;
    while(sum>nian(y)){
        sum-=nian(y);
        y++;}
        m1=0;
       row=IsRUN(y);
    for(i=0;a[row][i]<sum;i++){
        m1++;
        sum-=a[row][i];
    }
  printf("%04d-%02d-%02d\n",y,m1,sum);

}
return 0;}


为什么不对折腾死我了

发表于 2024-03-24 11:55:12 回复(0)
#include <stdio.h>

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

void Date(int year,int month,int day,int after_day){
    int date[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}};
    int next_year,next_month,next_day,isrun,d;
    d = after_day + day;
    next_month = month;
    next_year = year;
    while(d>0){
        isrun = Is_run(next_year);
        d -= date[isrun][next_month++];
        if(next_month>12){
            next_month=1;
            next_year ++;
        }
    }
    next_month--;
    if(next_month < 1){
        next_month = 12;
        next_year--;
    }
    d += date[isrun][next_month];
    next_day = d;
    printf("%d-%02d-%02d\n",next_year,next_month,next_day);
}

int main() {
    int times;
    int year,month,day,after_day;
    scanf("%d",&times);
    for(int i = 0;i<times;i++){
        scanf("%d %d %d %d",&year,&month,&day,&after_day);
        Date(year, month, day, after_day);
    }
    return 0;
}
发表于 2024-01-02 16:43:13 回复(0)
#include <stdio.h>

int main() {
    int m;
    int month[12]={31,28,31,30,31,30,31,31,30,31,30,31};
    scanf("%d",&m);
    while (m--) { // 注意 while 处理多个 case
        // 64 位输出请用 printf("%lld") to 
        int y,mo,d,n;
        scanf("%d %d %d %d",&y,&mo,&d,&n);
        if(y%4==0&&y%100!=0){
            month[1]=29;
        }
        if(n+d<=month[mo-1]){
            printf("%d-",y);
            if(mo<10){
                printf("0");
            }
            printf("%d-",mo);
            if(n+d<10){
                printf("0");
            }
            printf("%d\n",n+d);
        }
        else{
            n=n-(month[mo-1]-d);
            while(1){
                if(mo==12){
                    mo=0;
                    y++;
                    if(y%4==0&&y%100!=0){
                        month[1]=29;
                    }
                    else{
                        month[1]=28;
                    }
                }
                if(n-month[mo]<=0){
                    break;
                }
                n-=month[mo];
                mo++;
            }
            printf("%d-",y);
            if(mo+1<10){
                printf("0");
            }
            printf("%d-",mo+1);
            if(n<10){
                printf("0");
            }
            printf("%d\n",n);
        }
    }
    return 0;
}

发表于 2023-03-10 21:28:49 回复(0)
#include <stdio.h>

int LeapYear(int y) {
    return (y % 400 == 0) || (y % 100 != 0 && y % 4 == 0);
}

int main() {
    int a[][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}
    };
    int n, y, m, d, x, flag, i;
    scanf("%d", &n);
    while (n) {
        scanf("%d%d%d%d", &y, &m, &d, &x);
        x += d;
        flag = LeapYear(y);
        for (i = m; x > a[flag][i]; i ++) {
            x -= a[flag][i];
            if (i == 12) {
                y ++;
                flag = LeapYear(y);
                i = 0;
            }
        }
        printf("%4d-%02d-%02d\n", y, i, x);
        n --;
    }

    return 0;
}
先把日加到天数上 再计算比较方便

发表于 2023-02-22 19:12:29 回复(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 year, month,day;
    int number;
    int caseNumber;
    scanf("%d",&caseNumber);
    while(caseNumber--){
        scanf("%d %d %d %d", &year, &month,&day,&number);
        int row = IsLeapYear(year);
        for (int j = 0;j < month; ++j){
            number += dayTab[row][j];
        }
        number += day;
        while(number > NumberOfYear(year)){
            number -= NumberOfYear(year);
            year++;
        }
        month = 0;
        row = IsLeapYear(year);
        while(number > dayTab[row][month]){
            number -= dayTab[row][month];
            month++;
        }
        day = number;
        printf("%04d-%02d-%02d\n",year, month,day);
    }
    return 0;
}
发表于 2023-02-01 22:45:03 回复(0)

具体思路就是先将年月具体转换为第几天,然后再计算最后的日期.

但是要注意的是,加了时间之后还是今年吗,如果今年不是闰年那下一年是闰年吗?每一轮的数据使用完之后要进行清零处理,或者直接定义在循环内。


#include <stdio.h>

int year(int year) {
    if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0) {
        return 1;
    } else {
        return 0;
    }
}
int main() {
    int yearType[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}
    };
    int m = 0;

    scanf("%d", &m);
    while (m--) {
        int yyyy, mm, dd, n = 0;
        int day = 0;
        scanf("%d %d %d %d", &yyyy, &mm, &dd, &n);
        int flag = year(yyyy);
        for (int i = 0; i < mm; i++) {
            day += yearType[flag][i];
        }
        day = day + dd + n;
        if (flag == 1 && day > 366) {
            yyyy += 1;
            day -= 366;
        }
        if (flag == 0 && day > 365) {
            yyyy += 1;
            day -= 365;
        }
        int month = 0;
        flag = year(yyyy);
        while (day > yearType[flag][month]) {
            day -= yearType[flag][month];
            month++;
        }
        printf("%04d-%02d-%02d\n", yyyy, month, day);
    }

    return 0;
}
发表于 2023-01-24 11:19:02 回复(0)
#include <stdio.h>
#include <stdbool.h>
int main() {
    int m, year, mon, day, sum;
    scanf("%d", &m);
    int month[13] = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
    bool isleap;

    for (int i = 0; i < m; i++) {
        scanf("%d %d %d %d", &year, &mon, &day, &sum);
        for (int i = 0; i < sum; i++) {
            isleap = year % 400 == 0 || year % 4 == 0 & year % 100 != 0;
            if (isleap) {
                month[2] = 29;
            } else {
                month[2] = 28;
            }
            day++;
            if (day > month[mon]) {
                day = 1;
                mon++;
                if (mon > 12) {
                    mon = 1;
                    year++;
                }
            }

        }
        printf("%04d-%02d-%02d\n", year, mon, day);

    }

}
发表于 2023-01-13 15:31:49 回复(0)
#include <stdio.h>

int main() {
    int a = 0;
    scanf("%d", &a);
    int MonthDay[13] = {0,31,28,31,30,31,30,31,31,30,31,30,31};
    int year = 0;
    int month = 0;
    int day = 0;
    int sum = 0;
    while(~scanf("%d%d%d%d", &year, &month, &day, &sum))
    {
        if((year%400 == 0)||(year%4 == 0 && year % 100 != 0))
            MonthDay[2] = 29;
        int i = month;
        sum+=day;
        while(sum>MonthDay[i])
        {
            sum-=MonthDay[i];
            ++month;
            ++i;
            if(month > 12)
            {
                ++year;
                if((year%400 == 0)||(year%4 == 0 && year % 100 != 0))
                    MonthDay[2] = 29;
                else
                    MonthDay[2] = 28;
                month = 1;
                i = 1;
            }
        }
        day = sum;
        printf("%4d-%02d-%02d\n",year,month,day);
    }
    return 0;
}简单好理解
发表于 2022-10-20 22:47:54 回复(0)
#include<stdio.h>
typedef struct date
{
	int year;
	int month;
	int day;
}date;

int Getmonthday(int year, int month)
{
	int Day[] = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
	if (month == 2 && (year % 4 == 0 && year % 100 != 0) || year % 400 == 0)
	{
		return Day[month] + 1;
	}
	else
		return Day[month];
}
date newdate(date d,int n)
{
    d.day+=n;
    while(d.day>Getmonthday(d.year, d.month))
    {
        d.day-=Getmonthday(d.year, d.month);
        d.month++;
        if(d.month>12)
        {
            d.year++;
            d.month=1;
        }
        
    }
    return d;
}
int main()
{
    date d1;
    date d2;
    int n=0;
    int m=0;
    scanf("%d",&m);
    while(m--)
    {
        scanf("%d %d %d %d",&d1.year,&d1.month,&d1.day,&n);
        d2=newdate(d1,n);
        printf("%04d-%02d-%02d",d2.year,d2.month,d2.day);
        printf("\n");
    }
    return 0;
 }

发表于 2021-10-25 15:02:46 回复(0)