任务描述
本关任务:设计一个程序用于向后推算指定日期经过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);
}