首页 > 试题广场 >

日期类

[编程题]日期类
  • 热度指数:11776 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解
编写一个日期类,要求按xxxx-xx-xx 的格式输出日期,实现加一天的操作

输入描述:
输入第一行表示测试用例的个数m,接下来m行每行有3个用空格隔开的整数,分别表示年月日。测试数据不会有闰年。


输出描述:
输出m行。按xxxx-xx-xx的格式输出,表示输入日期的后一天的日期。
示例1

输入

2
1999 10 20
2001 1 31

输出

1999-10-21
2001-02-01

备注:
注意个位数日期前面要有0。
#include<iostream>
using namespace std;
int main(){
    int n;
    cin>>n;
    int table[12]={31,28,31,30,31,30,31,31,30,31,30,31};
    while(n>0){
        int y,m,d;
        cin>>y>>m>>d;
        if(d==table[m-1]&&m!=12){
            m=m+1;
            d=1;
        }
        else if(d==table[m-1]&&m==12){
            y=y+1;
            m=1;
            d=1;
        }
        else 
            d=d+1;
        if(m<10)
            cout<<y<<"-0"<<m;
        else
            cout<<y<<"-"<<m;
        if(d<10)
            cout<<"-0"<<d<<endl;
        else
            cout<<"-"<<d<<endl;
        n--;
    }
}

发表于 2019-02-26 13:40:56 回复(0)
先将日期转换,加1后再换回来。代码仍不够简洁、统一,希望大家不吝赐教
#include<iostream>
#include<cstdio>
//#define IsLeapYear(x) ((x%4==0&&x%100!=0)||(x%400==0)?1:0);
using namespace std;
const int daytab[13] = {
    0,31,28,31,30,31,30,31,31,30,31,30,31
};
typedef struct date{
    int year,month,day;
}Date;
int trans2num(Date x){
    int number=0;
    int month=x.month,day=x.day;
    for(int i=0; i<month; i++){
        number += daytab[i];
    }
    number += day;
    return number;
}
int main(){
    int plus;
    int CaseNumber;
    cin>>CaseNumber;
    Date date_1;
    while(CaseNumber--){
        scanf("%04d %02d %02d",&date_1.year,&date_1.month,&date_1.day);
        plus = trans2num(date_1)+1;
        if(plus>365){
            plus -= 365;
            date_1.year += 1;
        }
        int month=0,day;
        while(plus>daytab[month]){
            plus -= daytab[month];
            month ++;
        }
        day = plus;
        printf("%04d-%02d-%02d\n",date_1.year,month,day);
    }
    return 0;
}

发表于 2020-02-11 21:53:59 回复(3)
#include<bits/stdc++.h>
int a[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
int main(){
    int n,y,m,d;
    while(scanf("%d",&n)!=EOF){
        for(int i=0;i<n;i++){
            scanf("%d %d %d",&y,&m,&d);
            int t=d+1;
            d=t%(a[m]+1);
            if(d==0) d=1;
            int tt=m+t/(a[m]+1);
            m=(tt)%13;
            if(m==0) m=1;
            y=y+tt/13;
            printf("%d-%02d-%02d\n",y,m,d);
        }
    }
}
发表于 2019-03-09 12:42:12 回复(1)
#include<iostream>
using namespace std;
//区分闰年,平年中2月的区别,以及月末时期,年末时期的进位
void caculate(int year,int month,int day)
{
    day += 1;
    if(year % 400 == 0 ||(year % 4 == 0 && year % 100 != 0))
    {
        if(month == 1 || month == 3 || month == 5 || month == 7 || month == 8 || month == 10 || month == 12)
        {
            if(day > 31)
            {
                day = 1;
                month += 1;
                if(month > 12)
                {
                    year += 1;
                    month = 1;
                }
            }
        }
        else if(month == 2)
        {
            if(day > 29)
            {
                day = 1;
                month += 1;
            }
        }
        else
        {
            if(day > 30)
            {
                day = 1;
                month += 1;
            }
        }
    }
    else
    {
        if(month == 1 || month == 3 || month == 5 || month == 7 || month == 8 || month == 10 || month == 12)
        {
            if(day > 31)
            {
                day = 1;
                month += 1;
                if(month > 12)
                {
                    year += 1;
                    month = 1;
                }
            }
        }
        else if(month == 2)
        {
            if(day > 28)
            {
                day = 1;
                month += 1;
            }
        }
        else
        {
            if(day > 30)
            {
                day = 1;
                month += 1;
            }
        }
    }
    cout << year << "-";
    printf("%02d-%02d\n",month,day);//c的格式化输出右对齐宽度为2,不足用0补位
}

int main(void)
{
    int m;
    while(cin >> m)
    {
        while(m--)
        {
            int year,month,day;
            cin >> year >> month >> day;
            caculate(year, month, day);
        }
    }
    return 0;
}

发表于 2022-02-14 14:47:44 回复(0)
#include<stdio.h>
int main()
{
    int a[2][13]={{0,31,28,31,30,31,30,31,31,30,31,30,31},{0,31,28,31,30,31,30,31,31,30,31,30,31}};
    int n,y,m,d,key;
    scanf("%d",&n);
    while(n--)
    {
        scanf("%d%d%d",&y,&m,&d);
        key=0;
        if(y%4==0&&y%100!=0||y%400==0) key=1;
        d=d+1;
        if(d>a[key][m])//月份加一
        { m=m+1;d=1; }
        if(m>12)//年份加一
        { y=y+1;m=1;d=1;  }
        printf("%4d-%02d-%02d\n",y,m,d);
    }
}

发表于 2020-05-09 16:46:59 回复(0)
#include <stdio.h>
int month_day[12]= {31,28,31,30,31,30,31,31,30,31,30,31};
int main() {
    int m;
    while(scanf("%d",&m)!=EOF) {
        for(int i=0; i<m; i++) {
            int year,month,day;
            scanf("%d%d%d",&year,&month,&day);
            int days=month_day[--month];
            month+=day/days;
            day%=days;
            year+=month/12;
            month%=12;
            printf("%04d-%02d-%02d\n",year,month+1,day+1);
        }
    }
}

发表于 2020-04-16 12:07:46 回复(0)

教训:写这代码的时候,不断在怀疑人生。

经验:学习一下高赞代码的简洁度。

#include <bits/stdc++.h>
using namespace std;
int main(){
	int y,m,d,n;
	cin>>n;
	while(n--){
		cin>>y>>m>>d;
		switch(d){
			case 28:
				if(m==2) cout<<y<<"-0"<<m+1<<"-01"<<endl;
				else 
					if(m<10)cout<<y<<"-0"<<m<<"-29"<<endl;
					else cout<<y<<"-"<<m<<"-29"<<endl;
					break;
			case 30:
				if(m==4||m==6) cout<<y<<"-0"<<m+1<<"-01"<<endl;
				else if(m==9||m==11) cout<<y<<"-"<<m+1<<"-01"<<endl;
				else if(m==12)cout<<y<<"-"<<m<<"-31"<<endl;
				else cout<<y<<"-0"<<m<<"-31"<<endl;
				break;
			case 31:
				if(m==12)
				cout<<y+1<<"-01-01"<<endl;
				else if(m==10)
					cout<<y<<"-"<<m+1<<"-01"<<endl;
				else
					cout<<y<<"-0"<<m+1<<"-01"<<endl;
					break;
			default:
				if(m<10){
					if(d+1<10) cout<<y<<"-0"<<m<<"-0"<<d+1<<endl;
					else cout<<y<<"-0"<<m<<"-"<<d+1<<endl;
					}
				
				else {
					if(d+1<10)  cout<<y<<"-"<<m<<"-0"<<d+1<<endl;
					else	cout<<y<<"-"<<m<<"-"<<d+1<<endl;
				}
					
	
		}
	}
	return 0;
}



发表于 2020-03-03 22:02:24 回复(1)
#include<iostream>
#include<iomanip>
using namespace std;
int dayofmonth[13] = { 0,31,28,31,30,31,30,31,31,30,31,30,31 };
class Data
{
    int year;
    int month;
    int day;
public:
    Data(int year=0, int month=0, int day=0)
    {
        this->year = year;
        this->month = month;
        this->day = day;
    }
    ~Data() {};
    
    void getdata()
    {
        day++;
        if (day > dayofmonth[month])
        {
            day = 1;
            month++;
            if (month > 12)
            {
                year++;
            }
        }
        cout << year << "-" << setfill('0') << setw(2) << month << "-" << setfill('0') << setw(2) << day << endl;
    }
};
int main()
{
    int n, year, month, day;
    while (cin >> n)
    {
        Data *a[n];
        for(int i=0;i<n;i++)//把数据全部输入,所以前面创建了指针数组指向每个类对象
        {
           cin >> year >> month >> day;
           a[i] = new Data(year, month, day);
        }
        for (int i = 0; i < n; i++)a[i]->getdata();//再把要求的答案全部输出
    }
    return 0;
}

发表于 2020-02-14 20:52:52 回复(0)
#include<iostream>
using namespace std;

int daytab[13] = {
	0,31,28,31,30,31,30,31,31,30,31,30,31
};

int main()
{
	int caseNumber;
	scanf("%d", &caseNumber);

	int year, month, day;
	int newYear, newMonth, newDay;

	for (int i = 0; i < caseNumber; i++)
	{
		scanf("%d%d%d", &year, &month, &day);

		//除非输入日期是12月的最后一天,则第二天是新的一年
		//否则,年份不变
		if (month == 12 && day == 31)
		{
			newYear = year + 1;
			newMonth = 1;
			newDay = 1;

			printf("%04d-%02d-%02d\n", newYear, newMonth, newDay);
			continue;
		}
		else
			newYear = year;

		//排除本年度最后一天
		//如果输入日期是本月份最后一天,则第二天是下一个月
		//否则,月份不变
		if (daytab[month] == day)
		{
			newYear = year;
			newMonth = month + 1;
			newDay = 1;

			printf("%04d-%02d-%02d\n", newYear, newMonth, newDay);
			continue;
		}
		else
			newMonth = month;

		//排除本年分最后一天和本月最后一天
		//只需将天数加一即可
		newDay = day + 1;
		printf("%04d-%02d-%02d\n", newYear, newMonth, newDay);
	}

	return 0;
}


发表于 2020-01-19 14:52:37 回复(1)
#include <iostream>
#include <cstdio>
using namespace std;

int monDay[12]={31,28,31,30,31,30,31,31,30,31,30,31};
class Date
{
    private:
        int year,mon,day;
    public:
        void cal()
        {
            cin >> year >> mon >> day;
            if(++day > monDay[mon-1])
            {
                mon++;
                day=1;
                if(mon > 12)
                {
                    year++;
                    mon=1;
                }
            }
            printf("%d-%02d-%02d\n",year,mon,day);
        }
};
int main()
{
    int m;
    cin >> m;
    while(m--)
    {
        Date x;
        x.cal();
    }
    return 0;
}
发表于 2019-03-29 20:25:56 回复(3)
不测试闰年的话,只有三种情况(12-31,12-30,11-30)枚举更简单些
#include<iostream>
#include<cstring>
using namespace std;
const int month[13] = { 0,31, 28,31,30,31,30,31,31,30,31,30,31 };
int fun(int year, int mon, int day) {
	if (mon == 12 && day == 31) {
		year++;
		mon = day = 1;
	}
	else {
		if (day < month[mon]) {
			day++;
		}
		else {
			mon++; day = 1;
		}
	}
	printf("%04d-%02d-%02d\n", year, mon, day);
	return 0;
}
int main() {
	int m, year, mon, day;
	while (cin >> m) {
		for (int i = 0; i < m; i++) {
			cin >> year >> mon >> day;
			fun(year, mon, day);
		}
	}
	return 0;
}

发表于 2020-02-17 10:49:52 回复(0)
#include <iostream>
using namespace std;
#define IsLeap(x) ((x%4==0)&&(x%10!=0))||(x%400==0) ? 1:0
int dayOfMonth[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}
};

struct Date{
    int Year;
    int Month;
    int Day;
    void nextDay(){
        Day++;
        if(Day>dayOfMonth[IsLeap(Year)][Month]){
            Day=1;
            Month++;
            if(Month>12){
                Month=1;
                Year++;
            }
        }
    }
};

int main() {
    int n,y,d,m;
    Date tmp;
    cin>>n;
    for(int i=0;i<n;i++){
        cin>>y>>m>>d;
        tmp.Year=y;
        tmp.Month=m;
        tmp.Day=d;
        tmp.nextDay();
        printf("%04d-%02d-%02d\n",tmp.Year,tmp.Month,tmp.Day);
    }
}
发表于 2024-02-29 16:49:19 回复(0)
#include <stdio.h>

int day[13] = {0, 31, -1, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};

int main()
{
    int m;
    while(~scanf("%d", &m))
    {
        while(m--)
        {
            int y, m, d;
            scanf("%d%d%d", &y, &m, &d);
            if(y % 400 == 0 && (y % 4 == 0 && y % 100 != 0))
                day[2] = 29;
            else
                day[2] = 28;
            d++;
            if(d == day[m] + 1)
            {
                m++;
                d = 1;
                if(m > 12)
                {
                    y++;
                    m = 1;
                }
            }
            printf("%04d-%02d-%02d\n", y, m, d);
        }
    }
}

发表于 2020-04-03 14:33:59 回复(0)
#include <iostream>
#include <cstdio>
using namespace std;
bool isleap(int x){
    if(x%4==0&&x%100!=0||x%400==0) return true;
    else return false;
}
int main() {
    int n;
    cin>>n;
    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(n--){
        int y,m,d;
        cin>>y>>m>>d;
        int sum=d+1;
        while(sum>month[isleap(y)][m]){
            sum-=month[isleap(y)][m];
            m++;
            if(m>12){
                y++;
                m=1;
            }
        }
        printf("%04d-%02d-%02d",y,m,sum);
        cout<<endl;
    }
}

发表于 2024-03-25 16:26:56 回复(0)
import java.util.Scanner;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        // TODO 自动生成的方法存根
        Scanner in = new Scanner(System.in);
        int num  = in.nextInt();
        for (int i = 0; i < num; i++) {
            int year = in.nextInt();
            int month = in.nextInt();
            int day = in.nextInt();
            if (day == 30 && (month == 4 || month == 6 || month == 9 || month == 11)) {
                month += 1;
                day = 1;
            } else if (day == 31 && (month == 1 || month == 3 || month == 5 || month == 7 ||
                                     month == 8 || month == 10)) {
                month += 1;
                day = 1;
            } else if (day == 31 && month == 12) {
                year += 1;
                month = 1;
                day = 1;
            } else if (day == 28 && month == 2) {
                month += 1;
                day = 1;
            } else {
                day += 1;
            }
            System.out.print(year);
            if (month < 10) {
                System.out.print("-0" + month);
            } else {
                System.out.print("-" + month);
            }
            if (day < 10) {
                System.out.print("-0" + day);
            } else {
                System.out.print("-" + day);
            }
            System.out.println();

        }
    }
}

编辑于 2024-03-25 11:48:01 回复(0)
#include <stdio.h>

int main() {
    int n;
    scanf("%d",&n);
    int year[]={0,31,0,31,30,31,30,31,31,30,31,30,31};
    while (n--) {
        int y,m,d;
        scanf("%d %d %d",&y,&m,&d);
        if ((y%4==0&&y%100!=0)||y%400==0) {
            year[2]=29;
        }else {
            year[2]=28;
        }

        d=d+1;
        if (year[m]<d) {
            d=1;
            m=m+1;
            if (m>12) {
                m=1;
                y=y+1;
            }
        }
        printf("%4d-%02d-%02d\n",y,m,d);

    }
    return 0;
}

发表于 2024-03-24 19:11:37 回复(0)
#include<stdio.h>
int Months[13] = {0,31,28,31,30,31,30,31,31,30,31,30,31};

bool IsRun(int year){
    if((year%100!=0&&year%4==0)||(year%400==0)){
        return true;
    }else return false;
}

void nextDay(int &year,int &month,int &day){
    int maxDay = Months[month];
    if(month==2&&IsRun(year)) maxDay++;
    if(day==maxDay){
        if(month==12) { year++; month = 1; day =1;}
        else {month++; day = 1;}
    }else{
        day ++;
    }
}

int main(){
    int N;
    int y,m,d;
    scanf("%d",&N);
    for(int i=0;i<N;i++){
        scanf("%d%d%d",&y,&m,&d);
        nextDay(y,m,d);
        printf("%d-",y);
        if(m/10==0) printf("0");
        printf("%d-",m);
        if(d/10==0) printf("0");
        printf("%d\n",d);
    }
}

发表于 2024-03-16 16:45:52 回复(0)
#include <stdio.h>

int arr[2][12] = {
        {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31},
        {31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}
};

int main() {
    int n;
    scanf("%d", &n);
    for (int i = 0; i < n; ++i) {
        int y, m, d;
        scanf("%d%d%d", &y, &m, &d);
        int b = (y % 4 == 0 && y % 100 != 0) || (y % 400 == 0); // 是否闰年
        d++;
        if (d > arr[b][m - 1]) { // 若当前日为当前月的最后一天,需要改变月
            d = 1;
            m++;
            if (m == 13) { // 若当前月是本年的最后一月,需要改变年
                y++;
                m = 1;
            }
        }
        if (m < 10 && d < 10) {
            printf("%d-0%d-0%d\n", y, m, d);
        } else if (m >= 10 && d < 10) {
            printf("%d-%d-0%d\n", y, m, d);
        } else if (m < 10 && d >= 10) {
            printf("%d-0%d-%d\n", y, m, d);
        } else {
            printf("%d-%d-%d\n", y, m, d);
        }
    }
    return 0;
}

发表于 2024-02-05 21:13:24 回复(0)
#include <iomanip>
#include <iostream>
#include <istream>
#include <ostream>
using namespace std;

inline int daysOfMonth(int month) { //一个月的天数
    switch (month) {
        case 1:
        case 3:
        case 5:
        case 7:
        case 8:
        case 10:
        case 12:
            return 31;
        case 2:
            return 28;  //测试数据不会有闰年
        default:
            return 30;
    }
}

class Date {    //日期类
  private:
    int year, month, day;   //年月日

  public:
    //重载输入流运算符
    friend istream& operator>>(istream& in, Date& date);

    //重载输出流运算符
    friend ostream& operator<<(ostream& out, const Date& date);

    //重载前置“++”运算符
    Date& operator++();
};

istream& operator>>(istream& in, Date& date) {
    in >> date.year >> date.month >> date.day;
    return in;
}

ostream& operator<<(ostream& out, const Date& date) {
    out << date.year << "-"
        << setw(2) << setfill('0') << date.month << "-"
        << setw(2) << setfill('0') << date.day;
    return out;
}

Date& Date::operator++() {
    day++;
    if (day > daysOfMonth(month)) {
        day -= daysOfMonth(month);
        month++;
        if (month > 12) {
            month -= 12;
            year++;
        }
    }
    return *this;
}

int main() {
    int m;
    cin >> m;
    while (m--) {
        Date date;
        cin >> date;
        cout << ++date << endl;
    }
    return 0;
}

发表于 2024-02-03 09:48:33 回复(0)
#include <iostream>
#include <cstdio>
#include<iomanip>

using namespace std;

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 is_leap_year(int year) {
    return (year%4==0&&year%100==0) || year%400==0;
}

int day_of_year(int year) {
    if(is_leap_year(year)) return 366;
    return 365;
}

int main() {
    int m,year,month,day;
    cin>>m;
    while(m-->0) {
        cin>>year>>month>>day;
        int count = day+1;
        int row = is_leap_year(year);
        //year
        for(int i = 1; i < month; i++) {
            count+=daytab[row][i];
        }
        if(count>day_of_year(year)) {
            count-=day_of_year(year);
            year++;
        }    
        //month
        row = is_leap_year(year);
        for(int i = 1; i < 13; i++) {
            if(count<=daytab[row][i]) {
                month=i;
                break;
            } 
            count-=daytab[row][i];
        }    
        day=count;
        cout<<setw(4)<<setfill('0')<<year<<"-";
        cout<<setw(2)<<setfill('0')<<month<<"-";
        cout<<setw(2)<<setfill('0')<<day<<endl;
    }
}

发表于 2023-08-18 15:57:18 回复(0)