日期推算 (函数、指针)

任务描述

本关任务:设计一个程序用于向后推算指定日期经过n天后的具体日期。

编程要求

根据提示,在右侧编辑器补充代码,输入为长度为8的字符串str和一个正整数n,str前四位表示年份,后四位表示月和日。当推算出的年份大于4位数时,输出“out of limit!”,否则输出8位的具体日期。

测试说明

平台会对你编写的代码进行测试:

测试输入: 00250709 60000 预期输出: 01891017

下面这一代码版本有2个测试集通不过

测试输入:73860425 72431 预期输出:75840816 实际输出:75840815

测试输入:06250615 1099666 预期输出:36360327 实际输出:36360326

//有问题的代码
#include <iostream>
#include<iomanip>
using namespace std;
int a[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 b[2] = { 365,366 };
int judge(int a)
{
	if ((a % 4 == 0 && a % 100 != 0) || a % 400 == 0) return 1;
	else return 0;
}
//返回从1年1月1日开始(包括当天)到输入天数(不包括当天)所经历的天数
int days_1(int year, int month, int day)
{
	int sum = 0;
	for (int i = year; i > 1; i--)
	{
		sum += b[judge(i)];
	}
	for (int j = month; j > 1; j--)
	{
		sum += a[judge(year)][j - 1];
	}
	sum += day - 1;
	return sum;
}
//输入n(n大于0),则返回从1年1月1日(包括当天)开始经过了n天后的日期(不包括当天)
void days_2(int sum, int& year, int& month, int& day)
{
	for (year = 1; sum >= b[judge(year)]; year++)
	{
		sum -= b[judge(year)];
	}
	for (month = 0; sum >= a[judge(year)][month]; month++)
	{
		sum -= a[judge(year)][month];
	}
	month++;
	day = sum + 1;
	return;
}
int main()
{
    int a, n, year, month, day;
    cin >> a >> n;
    year = a / 10000;
    month = a %10000/100;
    day = a % 100;
    //cout << year <<" "<< month<<" " << day;
    //for (i = 0; i < 8; i++)
    //    cin >> a[i];
    //for (i = 0; i < 8; i++)
    //{
    //    d =d+ (a[i] - 48);
    //}
	n += days_1(year, month, day);
	days_2(n, year, month, day);
	if (year / 10000 > 0) cout << "out of limit!";
	else cout << setfill('0') << setw(4) << year << setfill('0') << setw(2) << month << setfill('0') << setw(2) << day << endl;
	//cout << year << "." << month << "." << day << endl;


    return 0;
}

下面是2种错得很离谱的代码,菜鸟落泪,有空请看看。

#include <iostream>
#include <cmath>
#include <iomanip>
using namespace std;

int main()
{   
    int m_year = 0;
    for (int i=0; i<4; i++) {
        int c = cin.get(); 
        m_year += c * pow(10, 3-i);
    }
    int m_month = 0;
    for (int j=0; j<2; j++) {
        int c = cin.get();
        m_month += c * pow(10, 1-j);
    }
    int m_day = 0;
    for (int j=0; j<2; j++) {
        int c = cin.get();
        m_day += c * pow(10, 1-j);
    }
    cin.get();
    int n;
    cin >> n;
    class Date {
        int month_days[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
        int year;
        int month;
        int day;
    public:
        Date(int y=0, int m=0, int d=0) {
            year = y;
            month = m;
            day = d;
        };
        static int getMonthDay(int y, int n); //返回y年n月的天数
        bool leapYear(int y) const;
        int countLeapYear(int y) const;
    };


    int Date::getMonthDay(int y, int n) {
        return month_days[n-1] + (n==2 && (y%400==0 || (y%4==0&&y%100!=0)));
    }
    bool Date::leapYear(int y) const {
        return y%400==0 || (y%400==0 || (y%4==0&&y%100!=0));
    }
    int Date::countLeapYear(int y) const {
        if (year == y) return leapYear(y);
        int begin = year;
        int end = y - 1;
        if (year > y) {
            begin = year;
            end = y - 1;
        }
        while (!leapYear(begin)) {
            ++begin;
        }
        while (!leapYear(end)) {
            --end;
        }
        int tmp = begin;
        int count = 0;
        if (begin <= end) {
            while (tmp <= end && tmp % 100) {
                ++tmp;
            }
            for (; tmp<=end; !leapYear(tmp) ? ++count, tmp += 100);
            return (end-begin) / 4 + 1 -count;
        }
        return 0;
    }
    Date Date::operator+(size_t n) const {
        Date tmp = *this;
        size_t count = 0;
        for (int i=1; i<tmp.month; i++) {
            count += getMonthDay(tmp.year, i);
        }
        count += tmp.day;
        if (n>=(365 + leapYear(tmp.year) - count)) {
            n -= (365 + leapYear(tmp.year) - count);
            tmp.month = 12;
            tmp.day = 31;
            while (n >= (365 + leapYear(tmp.year+1))) {
                n -= (365 + leapYear(tmp.year+1));
            }
        }
        for (; n>0; --n) {
            if (tmp.day == getMonthDay(tmp.year, tmp.month)) {
                tmp.day = 1;
                tmp.month == 12 ? tmp.month = 1, ++ tmp.year : ++tmp.month;
            }
            else {
                ++tmp.day;
            }
        }
        return tmp;
    }
    Date a = Date(m_year, m_month, m_day);
    Date b = a+n;
    cout << setw(4) << setfill('0') << b.year << setw(2) << setfill('0') << b.month << setw(2) << setfill('0') << b.day;
    return 0;
}
#include <iostream>
#include<iomanip>
using namespace std;

int a[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 b[2] = { 365,366 };

int judge(int a)
{
	if ((a % 4 == 0 && a % 100 != 0) || a % 400 == 0)return 1;
	else return 0;
}

//输入n(n大于0),则返回从1年1月1日(包括当天)开始经过了n天后的日期(不包括当天)
void date(int n, int& year, int& month, int& day)
{
	for (int i=month-1; i<12; i++) n -= a[judge(year)][i];
    n -= (a[judge(year)][month-1] - day);
    year ++;
    while (n>365) {
        n -= (judge(year)+365);
        year++;
    }
    for (int i=0; n >= a[judge(year)][i]; i++) {
        month++;
        n -= a[judge(year)][i];
    }
    day = n;
}

int main()
{
    int a, n, year, month, day;
    cin >> a >> n;
    year = a / 10000;
    month = (a % 10000)/100;
    day = a % 100;
	date(n, year, month, day);
	if (year >= 9999)
		cout << "out of limit!";
	else cout << setfill('0') << setw(4) << year << setfill('0') << setw(2) << month << setfill('0') << setw(2) << day << endl;
	//cout << year << "." << month << "." << day << endl;


    return 0;
}

 大佬的代码,正确!

#include <iostream>
using namespace std;

int yearday(int year);
int convertchartoint(char* text,int length);
void converinttochar(int num,char* const text,int n);
void convertobegin(int &year,int &month,int &day,long int &n);

int main()
{
    char p[9];
    cin>>p;
    long int n;
    cin>>n;

    //将字符串中的年份移到int型变量year中
    int year=convertchartoint(p,4);
    //月份转移到int型变量month中
    int month=convertchartoint(p+4,2);
    //将几号转移到int型变量day中
    int day=convertchartoint(p+6,2);
    //往前数化归到起始日期为某年第一天的问题
    convertobegin(year,month,day,n);
    //求过了n天后是哪一年,结果为year,还剩下n天
    while(n>=0){
        n-=yearday(year);
        ++year;
    }
    --year;n+=yearday(year);
    if(year>=10000){cout<<"out of limit!";return 0;}

    //求过了n天后是哪一月,结果为month,还剩下n天
    int monthday[12]={31,( (yearday(year)==365)?28:29 ),31,30,31,30,31,31,30,31,30,31};
    while(n>=0){
        n-=monthday[month-1];//烦,month月有monthday[month-1]天!
        ++month;
    }
    --month;n+=monthday[month-1];
    //求是哪一天,结果为day
    day=n+1;

    //输出模块
    converinttochar(year,p+3,4);
    converinttochar(month,p+5,2);
    converinttochar(day,p+7,2);
    cout<<p<<endl;
    return 0;
}
//化归到起始日期为某年第一天的问题
void convertobegin(int &year,int &month,int &day,long int &n)
{
    n+=day-1;day=1;

    int monthday[12]={31,( (yearday(year)==365)?28:29 ),31,30,31,30,31,31,30,31,30,31};
    for(;month>1;--month){
        n+=(monthday[month-1-1]);
    }
}
//将整型放到text结尾且总长为n的字符串,前面补0,text下一位
void converinttochar(int num,char* const text,int n)
{
    text[1]='\0';
    for(int i=0;i<n;++i){
        text[0-i]=('0'+num%10);
        num/=10;
    }
}
//将一串字符转成整型
int convertchartoint(char* text,int length)
{
    int num=0;
    for(int i=0;i<length;++i){
        num=num*10+(text[i]-'0');
    }
    return num;
}
//计算这一年有几天
int yearday(int year)
{
    bool leapyear=false;
    if( ((year%4==0)&&(year%100!=0))||(year%400==0) ){leapyear=true;}
    return ((leapyear)?366:365);
}

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值