题目描述:
大数学家高斯有个好习惯:无论如何都要记日记。
他的日记有个与众不同的地方,他从不注明年月日,而是用一个整数代替,比如:4210
后来人们知道,那个整数就是日期,它表示那一天是高斯出生后的第几天。这或许也是个好习惯,它时时刻刻提醒着主人:日子又过去一天,还有多少时光可以用于浪费呢?
高斯出生于:1777年4月30日。
在高斯发现的一个重要定理的日记上标注着:5343,因此可算出那天是:1791年12月15日。
高斯获得博士学位的那天日记上标着:8113
请你算出高斯获得博士学位的年月日。
提交格式:
yyyy-mm-dd, 例如:1980-03-21
题目分析:
有两个基本的思路,第一个思路常规的想法,按照顺序,从出生那天开始一直找到标记的那一天(题目中给出的是8113),然后输出那一天的日期;还有一个思路是逆向思维,从标记的那一天开始,不断减去经历过的年头,然后当减去的结果为0时,就是要输出的日期。
方法一:
#include<iostream> #define TOTAL 8113 using namespace std; int judge(int year) //用来判断平年闰年的函数 { if(year%400 == 0 || year%4 == 0&&year%100 !=0) { return 1; } else { return 0; } } void show(int n) { if(n<10) { cout<<0<<n; } else { cout<<n; } } int main() { int p[12]={31,28,31,30,31,30,31,31,30,31,30,31};//平年的月份 int r[12]={31,29,31,30,31,30,31,31,30,31,30,31};//闰年的月份 int year,month,day; year = 1777; int count=1; for(int i=4;i<12;i++) { count += p[i]; } bool tag = true; while(tag == true) { if(judge(++year)) //闰年 { if(count+366 >= TOTAL)//结果就在这一年 { cout<<year<<"-"; int sum = 0; int temp = TOTAL - count; for(int i=0;i<12;i++) { if(sum+r[i] >= temp)//结果就在这个月 { month = i+1; show(month); cout<<"-"; day = temp - sum; show(day); break; } else { sum += r[i]; } } break; } else { count += 366; } } else //平年 { if(count+365 >= TOTAL)//结果就在这一年 { cout<<year<<"-"; int sum = 0; int temp = TOTAL - count; for(int i=0;i<12;i++) { if(sum+p[i] >= temp)//结果就在这个月 { month = i+1; show(month); cout<<"-"; day = temp - sum; show(day); break; } else { sum += p[i]; } } break; } { count += 365; } } } return 0; }
输出结果:1799-07-16
方法二:
#include<iostream> #include<iomanip> #define TOTAL 8113 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 judge(int year) //用来判断平年闰年的函数 { if(year%400 == 0 || year%4 == 0&&year%100 !=0)return 1; else return 0; } int tday(int year,int month,int day,int (*a) [12]) { int total=day; int tag =judge(year); for(int i=0;i<month-1;i++) total += a[tag][i]; return total; } int main() { int year=1777,month=4,day=30; int n = TOTAL; n += tday(year,month,day,a)-1; while(n>0) { if(judge(year++))n -= 366; else n -= 365; } if(judge(--year)) n += 366; else n += 365; for(int i=0;i<12;i++) { if(n-a[judge(year)][i]<=0) { month = i+1; day = n; break; } else n -= a[judge(year)][i]; } cout<<year<<"-"<<setw(2)<<setfill(‘0‘)<<month<<"-"<<setw(2)<<setfill(‘0‘)<<day<<endl; return 0; }
输出结果:1799-07-16