经典编程题目解答1
1.年月日问题
#include<iostream>
#include<math.h>
#include<stdlib.h>
#include<iomanip>
using namespace std;
int days;
int get_dayofweek();
int get_year();
int get_month(int leap_year);
int main(){
//bool flag;//false for bike and true for walk;
int year,month,dayofweek;
int leap_year;
char week[7][10]={"Saturday","Sunday","Monday","Tuesday","Wednesday","Thursday","Friday"};
while((cin>>days)&&days!=-1){
dayofweek=get_dayofweek();
year=get_year();
leap_year=(year%4==0&&year%100!=0||year%400==0);
month=get_month(leap_year);
cout<<year<<'-';
if(month<10){
cout<<'0';
}
cout<<month<<'-';
if(days<9){
cout<<'0';
}
cout<<++days<<' ';
cout<<week[dayofweek];
cout<<endl;
}
return 0;
}
//cout<<fixed<<setprecision(2) << f
//有覆盖掉其他数值的可能性。
int get_dayofweek(){
int dayofweek;
dayofweek=days%7;
return dayofweek;
}
int get_year(){
int i=2000,leap_year;
while(1){
leap_year=(i%4==0&&i%100!=0||i%400==0);
if(days>=366&&leap_year==1){
days-=366;
i++;
continue;
}
if(days>=365&&leap_year==0){
days-=365;
i++;
continue;
}else
break;
}
return i;
}
int get_month(int leap_year){
int pmonth[12]={31,28,31,30,31,30,31,31,30,31,30,31};
int rmonth[12]={31,29,31,30,31,30,31,31,30,31,30,31};
int j=0;
while(1){
if(leap_year==1&&days>=rmonth[j]){
days=days-rmonth[j];
j++;
}else if(leap_year==0&&days>=pmonth[j]){
days=days-pmonth[j];
j++;
}else break;
}
return ++j;
}
非常经典的一道题,可以细心替换一下。
另外一道相关的日历题目则是这道。
编程题#4:Tomorrow never knows?
来源: POJ (Coursera声明:在POJ上完成的习题将不会计入Coursera的最后成绩。)
注意: 总时间限制: 1000ms 内存限制: 65536kB
描述
甲壳虫的《A day in the life》和《Tomorrow never knows》脍炙人口,如果告诉你a day in the life,真的会是tomorrow never knows?相信学了计概之后这个不会是难题,现在就来实现吧。
读入一个格式为yyyy-mm-dd的日期(即年-月-日),输出这个日期下一天的日期。可以假定输入的日期不早于1600-01-01,也不晚于2999-12-30。
输入
输入仅一行,格式为yyyy-mm-dd的日期。
输出
输出也仅一行,格式为yyyy-mm-dd的日期
样例输入
样例输出
#include<iostream>
#include<math.h>
#include<stdlib.h>
#include<iomanip>
using namespace std;
int pmonth[12]={31,28,31,30,31,30,31,31,30,31,30,31};
int rmonth[12]={31,29,31,30,31,30,31,31,30,31,30,31};
bool isEndDay(int day,int month,bool leap_year){
if(leap_year){
if(day+1>rmonth[month-1]){
return true;
}else
return false;
}else if(!leap_year){
if(day+1>pmonth[month-1]){
return true;
}else
return false;
}
}
bool isEndMonth(int month){
if(month==12){
return true;
}else
return false;
}
bool isLeapYear(int year){
if(year % 4 == 0 && year % 100 != 0 || year % 400 == 0){
return true;
}else
return false;
}
int main(){
//bool flag;//false for bike and true for walk;
int year,month,day;
char dash;
cin>>year>>dash>>month>>dash>>day;
bool leap_year=isLeapYear(year);
bool end_month=isEndMonth(month);
bool end_day=isEndDay(day,month,leap_year);
if(leap_year){
if(end_month){
if(end_day){
year++;
month=1;
day=1;
}else
day++;
}else if(end_day){
month++;
day=1;
}else
day++;
}else if(!leap_year){
if(end_month){
if(end_day){
year++;
month=1;
day=1;
}else
day++;
}else if(day+1>pmonth[month-1]){
month++;
day=1;
}else
day++;
}
cout << year << "-" <<setw(2)<<setfill('0')<< month << "-" <<setw(2)<<setfill('0')<< day <<endl;
return 0;
}
这个告诉了我if…else和if…if是不一样的。用的时候得小心。这里还提到了两个有趣的格式化输出函数:setfill和setw
有兴趣可以看一下他们的用法。