蓝桥杯 初赛题目 高斯日记

蓝桥杯 初赛题目

高斯日记

题目描述:
大数学家高斯有个好习惯:无论如何都要记日记。
他的日记有个与众不同的地方,他从不注明年月日,而是用一个整数代替,比如:4210
后来人们知道,那个整数就是日期,它表示那一天是高斯出生后的第几天。这或许也是个好习惯,它时时刻刻提醒着主人:日子又过去一天,还有多少时光可以用于浪费呢?
高斯出生于:1777年4月30日。

在高斯发现的一个重要定理的日记上标注着:5343,因此可算出那天是:1791年12月15日。
高斯获得博士学位的那天日记上标着:8113   
请你算出高斯获得博士学位的年月日。

提交格式:

yyyy-mm-dd, 例如:1980-03-21

解题思路:

1、我们计算出高斯出生的那一天到出生年末的时间t1,我们用总的天数t减去t1,这样方便我们计算年数;

2、我们对接下来的每年相加,直到得到第一个天数大于t的年份,则该年份就是我们要求出的年份,按照同样的方法求出月份;

3、天数就是t减去以上的时间剩下的结果,还要注意特定的输出格式,输出结果中当天数和月份为个位数的时候,不是直接输出一个数,而是前面带有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 year)     //判断平年闰年的函数   
{  
    if(year%400==0||year%4==0&&year%100!=0)
    return 1;    //是闰年
    else 
    return 0;    //非闰年
}  
void show(int year,int month,int day)      //输出格式控制函数   
{  
    cout<<year<<"-";  
    cout<<setw(2)<<setfill('0')<<month<<"-";   //对于一位数的月份前面补0
    cout<<setw(2)<<setfill('0')<<day<<endl;    //对于一位数的天数前面补0
}  
int main()  
{  
    int year=1777;  
    int month=4;  
    int day=30;  
    int total=8113;  
    int num=1;  
    while(++month<=12)
    num += a[0][month-1];             //将1777年的剩余天数减去(即先存储在num中) 
    month=0;day=0;                   //月份和天数清零   
    while((num+=b[judge(++year)])<=total);   
    num -= b[judge(year)];          //找到了对应的年份   
    while((num+=a[judge(year)][++month])<=total);  
    num -= a[judge(year)][month];   //找到了对应的月份   
    day = total - num;             //找到对应的天数
    show(year,month,day);           //将结果输出   
}   
输出结果

在这里插入图片描述

总结思考

本题的巧妙体现在如下几点:

  • 用二维数组a[][]存储闰年和非闰年的每月天数

  • 用一维数组b[]存储闰年和非闰年的每年天数

  • 用函数judge(int year)来判断某个年份是否为闰年,是闰年则返回1,否则返回0,这样正好对应数组a[][]和数组b[]的各自天数

  • 先将高斯出生那年的剩余天数减去,方便接下来的计算

  • 再利用高斯获得博士学位的那天距离出生的天数为界限,用数组b[]将各年份天数加起来,找到目标年数year,用数组a[][]将各月天数加起来,找到目标月份month

本题一个注意的地方:

因为本题的输出有固定格式:yyyy-mm-dd, 例如:1980-03-21,这就要将一位数的月份以及一位数的天数在前面补0输出,本题中用show(int year,int month,int day)函数来控制输出的格式,其中用到了setw()、setfill()函数。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值