蓝桥杯 【初赛题目】 高斯日记



题目描述:


    大数学家高斯有个好习惯:无论如何都要记日记。

    他的日记有个与众不同的地方,他从不注明年月日,而是用一个整数代替,比如: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

蓝桥杯 【初赛题目】 高斯日记

上一篇:学会了钓鱼的小猫来到了软件开发公司...


下一篇:设计模式之策略模式