前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >蓝桥杯C/C++省赛:高斯日记

蓝桥杯C/C++省赛:高斯日记

作者头像
叶茂林
发布2023-07-30 11:57:41
1470
发布2023-07-30 11:57:41
举报

题目描述

大数学家高斯有个好习惯:无论如何都要记日记。 他的日记有个与众不同的地方,他从不注明年月日,而是用一个整数代替,比如:4210 后来人们知道,那个整数就是日期,它表示那一天是高斯出生后的第几天。这或许也是个好习惯,它时时刻刻提醒着主人:日子又过去一天,还有多少时光可以用于浪费呢? 高斯出生于:1777年4月30日。 在高斯发现的一个重要定理的日记上标注着:5343,因此可算出那天是:1791年12月15日。 高斯获得博士学位的那天日记上标着:8113 请你算出高斯获得博士学位的年月日。 提交答案的格式是:yyyy-mm-dd, 例如:1980-03-21

思路分析

题目的意思是给定高斯的出生日期,要我们算高斯出生后8113天的年月日。

区分开闰年和平年,建立闰年和平年的月份表如下:

代码语言:javascript
复制
int leap[12]={31,29,31,30,31,30,31,31,30,31,30,31};
int common[12]={31,28,31,30,31,30,31,31,30,31,30,31};

这样可以省去大量的条件判断,从人的角度思考,让日期一天天跑起来,如果day比对应月份的天数大,说明月份需要加一,而day需要回到一,否则day++,最后判断月份如果大于12,那么year++。 

AC代码

代码语言:javascript
复制
#include <iostream>
using namespace std;
int leap[12]={31,29,31,30,31,30,31,31,30,31,30,31};
int common[12]={31,28,31,30,31,30,31,31,30,31,30,31};
int main()
{
    int year=1777,month=4,day=30,days=8113;
    while(--days){
        if(year%400==0||year%4==0&&year%100!=0){
            if(day==leap[month-1]){
                day=1;
                month++;
            }else day++;
        }else{
            if(day==common[month-1]){
                day=1;
                month++;
            }else day++;
        }
        if(month>12){
            month=1;
            year++;
        }
    }
    cout<<year<<'-'<<month<<'-'<<day;
    return 0;
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-10-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 题目描述
  • 思路分析
  • AC代码
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档