猿问

可是超时,它时间限制是2s,有什么更简单的算法吗

输入

输入文件的每一行上有四个整数y、m、d、days,其中y表示年份(只考虑公元后的年份)、m表示月份、d表示m月中的第几天、days表示y年中第几天。

为问题简单起见,你可认为输入的数据是合法的。

输出

对输入中的每一个年月日数据y、m、d、days,在同一行上,先按y年m月d日输出这一天是这一年中的第几天,接着对y年的第days天输出这一天的日期(月和日)。三数据之间留一个空格,无前导字符“0”。尾部无多余空格。

输入样例

2007 7 6 230

2008 7 1 57

1999 2 19 365

输出样例

187 8 18

183 2 26

50 12 31

然后我写了以下代码
#include<iostream>
using namespace std;
int main()
{
int month[12]={31,28,31,30,31,30,31,31,30,31,30,31};
while(true)
{
int y,m,d,days,s=0;
cin>>y>>m>>d>>days;
if((y%4==0 && y%100!=0) || y%400==0)month[1]=29;
else month[1]=28;
for(int i=0;i<m-1;i++)
{
s+=month[i];
}
s+=d;
m=0;
while(days>month[m])
{
days-=month[m++];
}
cout<<s<<' '<<++m<<' '<<days<<endl;
}
return 0;
}

慕斯709654
浏览 126回答 2
2回答

波斯汪

//有点不规范,帮你改了一下。。现在很快了//原因可能是变量的重复创建导致速度减慢#include<iostream>using namespace std;int main(){int month[12]={31,28,31,30,31,30,31,31,30,31,30,31};int i, y,m,d,days,s=0;while(true){cin>>y>>m>>d>>days;if((y%4==0 && y%100!=0) || y%400==0)month[1]=29;else month[1]=28;for(i=0;i<m-1;i++) s+=month[i];s+=d;m=0;while(days>month[m]){days-=month[m++];}cout<<s<<' '<<++m<<' '<<days<<endl;}return 0;}

30秒到达战场

#include <iostream.h> //包含C++输入输出头文件class date //声明DATE类{int year;//声明类成员yearint month;//声明类成员monthint day;//声明类成员daypublic://以下为公有属性date(int y,int m,int d) //构造函数,传入参数y,m,d{year=y;month=m;day=d; //分别赋值给类成员year,month,day}void disp()//显示年月日函数{cout << year << "." << month << "." << day << endl;//分别显示年月日,格式为年.月.日}friend int count_day(date &d,int); //声明友元函数 count_day 天数双向计算函数,方向由传入的int是否为0决定friend int leap(int year);//声明友元函数leap 判断传入的year是否是闰年friend int subs(date d1,date d2);//声明友元函数subs 计算两个传入的date对象d1和d2相差多少天};int count_day(date &d,int flag) //count_day实现{static int day_tab[2][12]=,}; //每月天数数组,下标0为非闰年各月天数,下标1为闰年int p,i,s;//声明变量p,i,sif(leap(d.year))//如果传入对象d的year成员为闰年p=1; //则取数组下标为1elsep=0;//否则取0if(flag)//如果传入的flag变量非0{s=d.day;//s等于当月的天数for(i=1;i<d.month;i++) //循环,加上之前每月的天数s+=day_tab[p][i-1];}else //否则,当flag=0{s=day_tab[p][d.month]-d.day; //s=该月天数减去d的日数(也就是日期d离本月结束还有多少天)for (i=d.month+1;i<=12;i++) //循环,加上该月之后每月的天数s+=day_tab[p][i-1];}return(s);//返回s}int leap(int year)//闰年判断函数,是闰年返回1,否则返回0{if(year%4==0 && year%100!=0 || year%400==0)return 1;elsereturn 0;}int subs(date d1,date d2) //计算d1和d2相距多少天{int days,day1,day2,y;if(d1.year<d2.year) //如果d2年份大于d1{days=count_day(d1,0); 计算d1距年底还有多少天for(y=d1.year+1;y<d2.year;y++) 计算d1年份的之后一年到d2的年份的之前一年中间相隔多少天if(leap(y)) //是闰年就加366天days+=366L;elsedays+=365L;//否则加365天days+=count_day(d2,1); //计算d2所在年到d2所在日有多少天}else if (d1.year==d2.year) //如果年份相等{day1=count_day(d1,1);//计算d1距年初有多少天day2=count_day(d2,1);//计算d2距年初有多少天days=day2-day1;//相减即为相隔天数}else//否则,即如果d1年份大于d2,反向计算,过程基本同第一个if{days=count_day(d2,0);for(y=d2.year+1;y<d1.year;y++)if(leap(y))days+=366L;elsedays+=365L;days+=count_day(d1,1);}return days;}void main()//主函数{date d1(2000,1,1),d2(2005,10,1); //构造d1为2000年1月1日,d2为2005年10月1日int ds1=subs(d1,d2),ds2=subs(d2,d1); //ds1为d1与d2相距多少天,ds2为d2与d1相距多少天,实际由于subs函数内部自动判断d1 d2哪个大,所以输出应该是一样的cout << "日期d1:";d1.disp(); //显示日期d1cout << "日期d2:";d2.disp();//显示日期d2cout << "d1和d2相距" << ds1 << "天" << endl;//输出ds1cout << "d2和d1相距" << ds2 << "天" << endl;//输出ds2}
随时随地看视频慕课网APP
我要回答