36 条题解

  • 108
    @ 2023-6-10 0:26:00

    题目P1007 求日龄

    这是本蒟蒻的第一篇题解,请多多点赞关照


    题目解析

    这题其实很好理解 意为求从输入的年份到2022年10月20日一共多少天(作者本人生日在10月21日)


    点明思路

    许多同学也许回想到从出生日开始一天一天算到2022.10.20,但这非常耗时,可能会TLE(超时),所以我们要用点脑子,以下是我的思路: 将所有时间分成3段分别为:

    1. 出生这一年的天数;
    2. 从出生这一年+1到2019年的天数;
    3. 2022年的所有天数;

    编写代码

    写代码之前我们要知道一个问题闰年问题 我简单概括一下,即为4年一闰,400年一闰,100年不闰;那就可以得到以下函数

    bool year(int q)
    {
        if(q % 400 == 0)//400年一闰
        {
            return true;
        }
        if((q%4==0) && (q%100!=0))//4年一闰,100年不闰
        {
            return true;
        }
        else
        {
            return false;
        }
    }
    

    判断闰年解决了,要如何算每月的天数呢?我们从小背“一月大,二月小,三月大,四月······”计算机可没背过,所以我们可以定义数组:

    int a,s,d,ans = 0;//分别代表输入的年,月,日以及输出的答案ans
    int mon1[100] = {0,31,28,31,30,31,30,31,31,30,31,30,31};//普通年
    int mon2[100] = {0,31,29,31,30,31,30,31,31,30,31,30,31};//闰年
    
    回归正题

    我们要先写

    出生这一年的天数

    还是用分段的思路,我将其分成2段

    1.出生该月的剩余天数 这用mon[s]-d即可(s是输入月,d是是输入天) 2.出生该年的剩余月份天数 这用for从s+1到12,ans每次加mon[i]就好了(s是输入月,d是是输入天,ans是最终答案) 代码如下

    ans+=mon1[s]-d;//出生该月的剩余天数
    for(int i = s+1;i <= 12;i++)//枚举从s+1到12月
    {
        ans+=mon1[i];//加上每月天数
    }
    

    这是普通年的代码,闰年只要把数组改一下就好了

    ans+=mon2[s]-d;
    for(int i = s+1;i <= 12;i++)
    {
        ans+=mon2[i];
    }
    
    从出生这一年+1到2019年的天数

    这就很好理解了,就是枚举每一年,在判断是否为闰年,再加上相应的天数(闰年366天,普通年365天) 代码如下

    for(int i = a+1;i < 2022;i++)//枚举从a+1到2019年
    {
    	if(year(i))//判断闰年
    	{
    		ans+=366;
    	}
    	else
    	{
    		ans+=365;
    	}
    }
    
    2022年的所有天数;

    这简单,这是个固定的值,我都为大家算好了: 31+28+31+30+31+30+31+31+30+20 = 293 加上就好了


    下面整理一下代码
    //出生这一年的天数
    if(year(a))
    {
    	ans+=mon2[s]-d;
    	for(int i = s+1;i <= 12;i++)
    	{
    		ans+=mon2[i];
    	}
    }
    else
    {
    	ans+=mon1[s]-d;
    	for(int i = s+1;i <= 12;i++)
    	{
    		ans+=mon1[i];
    	}
    }
    //从出生这一年+1到2019年的天数
    for(int i = a+1;i < 2022;i++)
    {
    	if(year(i))
    	{
    		ans+=366;
    	}
    	else
    	{
    		ans+=365;
    	}
    }
    //2022年的所有天数;
    ans+=293;
    

    这时候有一个问题,当输入的年数为2022是,以上算法算出来的答案是错误的,这怎么办? 那就另外算咯 这与以上思路比较像,还是分段 1.2022该月的剩余天数

    这还是用mon[s]-d解决

    2.2022从该月+1到9月天数

    用枚举就好了,for从s+1到10,每次加mon[i]

    3.减去10月份多余的天,即31-20 = 11天

    代码如下

    ans+=mon1[s]-d;//该月的剩余天数
    for(int i = s+1;i < 10;i++)//枚举s+1到10月
    {
    	ans+=mon1[i];
    }
    ans-=11;//10月多余的11天
    

    代码全线讲解到此结束🎉️


    参考代码

    我是到各位很急,这不来了嘛 请勿一口吞噬,会被噎死封号的哦!

    #include <iostream>//别看了,老土了
    using namespace std;
    int a,s,d,ans = 0;
    int mon1[100] = {0,31,28,31,30,31,30,31,31,30,31,30,31};//普通月
    int mon2[100] = {0,31,29,31,30,31,30,31,31,30,31,30,31};//闰年月
    bool year(int q)//闰年判断
    {
        if(q % 400 == 0)
        {
            return true;
        }
        if((q%4==0) && (q%100!=0))
        {
            return true;
        }
        else
        {
            return false;
        }
    }
    int main()
    {
    	cin >> a >> s >> d;
    //小于2022年情况
    	if(a < 2022)
    	{
    		if(year(a))
    		{
    			ans+=mon2[s]-d;
    			for(int i = s+1;i <= 12;i++)
    			{
    				ans+=mon2[i];
    			}
    		}
    		else
    		{
    			ans+=mon1[s]-d;
    			for(int i = s+1;i <= 12;i++)
    			{
    				ans+=mon1[i];
    			}
    		}
    		for(int i = a+1;i < 2022;i++)
    		{
    			if(year(i))
    			{
    				ans+=366;
    			}
    			else
    			{
    				ans+=365;
    			}
    		}
    		ans+=293;
    	}
    //2022年情况
    	else
    	{
    		ans+=mon1[s]-d;
    		for(int i = s+1;i < 10;i++)
    		{
    			ans+=mon1[i];
    		}
    		ans-=11;
    	}
    	cout << ans;//输出
    	return 0;
    }
    

    相信各位一定听懂了吧,别忘了点赞

    • @ 2023-6-10 21:22:37

      感谢大佬,终于懂了

    • @ 2023-7-23 22:15:25

      让我怎么去否认~

    • @ 2023-8-1 8:24:23

      解析很全面

    • @ 2023-8-5 19:51:45

      本人生日在10月20日

    • @ 2023-8-5 19:57:59

      感谢,听懂了,讲的也很全面👍

    • @ 2023-8-5 20:25:41

      为什么我以前的号是Level9,现在才Level2

    • @ 2023-8-6 8:12:26

      @

      不同的域等级不在一起算

    • @ 2023-8-21 23:29:11

      很棒,我是懂了之后去写的捏,不过这里给楼主提个小错误,当输入日期为2022 10 X日时你的代码结果会很不对劲呢,建议有时间整改一下,Anyway,还是很感谢你的思路捏~~

    • @ 2023-9-28 20:57:19

      2023.9.28更新题解

      2022年十月份天数计算错误改正

      感谢 多宝鱼 同学(UID: 5930)指出的错误

    • @ 2024-4-21 9:38:11
      bool lpr(int y)
      {
          return ((y%4==0&&y%100!=0)||y%400==0);
      }
      

      这个简单些

    • @ 2024-4-26 20:58:21

      @ 我09年10月1号,就离谱

  • 37
    @ 2023-8-6 10:59:08
    //代码有亿点长,我看了看大家的思路,目前没有这种思路,我就发出来了,有一些些的绕。让我来解释一下吧。
    //我的思路是先算有几整年(几个365天)再算有几个整月(整30天/整31天/整28天)然后算零散的天数 当然还不能忘记闰年多加的那一天,四个函数一相加,就可以得到结果了。
    //闰年天数一定要加,因为大部分样例里那个人的生日在500-700年前。个人认为这些例子只是为了检验代码的,毕竟没人能活300-700岁。
    //四个函数分别是year_day(int a,int b,int c), month_day(int a,int b,int c),day_day(int a,int b,int c)(这里只是为了不重名)和runnian(int startt,int endd)
    
    
    #include <bits/stdc++.h>//题解由hetao1098709发布,禁止一口吞。
    //毕竟我也思考了半天,大家直接复制粘贴确实有亿点不太合适
    using namespace std;
    
    
    int year_day(int a,int b,int c)//算整年天数不含闰年
    {
        if(b<10||(b==10&&c<=20))//如果输入月日期在10月20号之前或是这一天
            return (2022-a)*365;//那么返回2022年10月20号到这一年的明年year+1年的天数
        else//如果月日期在10月20号之后
            return (2022-a-1)*365;//那么返回2022年10月20号到这一年的明年year+1年的天数
    }
    
    
    int month_day(int a,int b,int c)//计算完整年的天数后,开始计算整月的天数.
    {
        if(c<=20)//如果日期在20号之前
        {
            if(b==10)//如果在10月
                return 0;//返回0天
            else if(b==9)//如果在9月
                return 30;//返回30天9月有30天
            else if(b==8)//后面的应该明白了吧
                return 31+30;
            else if(b==7)
                return 31+31+30;
            else if(b==6)
                return 30+31+31+30;
            else if(b==5)
                return 31+30+31+31+30;
            else if(b==4)
                return 30+31+30+31+31+30;
            else if(b==3)
                return 31+30+31+30+31+31+30;
            else if(b==2)
                return 28+31+30+31+30+31+31+30;
            else if(b==1)
                return 31+28+31+30+31+30+31+31+30;
            else if(b==12)
                return 31+31+28+31+30+31+30+31+31+30;
            else if(b==11)
                return 30+31+31+28+31+30+31+30+31+31+30;
        }
        else//如果日期在20号之后
        {
            if(b==9)//同样的意思,只不过和上面错开了一个月
                return 0;
            else if(b==8)
                return 30;//9月有30天(特地给大家标了一下,后面的应该都理解了)
            else if(b==7)
                return 31+30;//这里这么写主要是为了能让大家更好懂。
            else if(b==6)
                return 31+31+30;
            else if(b==5)
                return 30+31+31+30;
            else if(b==4)
                return 31+30+31+31+30;
            else if(b==3)
                return 30+31+30+31+31+30;
            else if(b==2)
                return 31+30+31+30+31+31+30;
            else if(b==1)
                return 28+31+30+31+30+31+31+30;
            else if(b==12)
                return 31+28+31+30+31+30+31+31+30;
            else if(b==11)
                return 31+31+28+31+30+31+30+31+31+30;
            else if(b==10)
                return 30+31+31+28+31+30+31+30+31+31+30;
        }
    }
    
    
    int day_day(int a,int b,int c)//计算剩余零散天数
    {
        if(c<=20)
            return 20-c;
        else if(b==1||b==3||b==5||b==7||b==8||b==10||b==12)//如果本月有31天
            return 31-(c-20);//返回31天( 本月天数)-(日期-20号)
        else if(b==4||b==6||b==9||b==11)
            return 30-(c-20);//和上面一个意思哒
        else
            return 28-(c-20);//和上面一个意思哒
    }
    
    
    int runnian(int startt,int endd)//前面没有加闰年的天数,所以现在开始计算应该加多少天闰日,也就是有几个闰年.
    {
        //startt代表开始的年,endd代表结束的年.
        int sum=0;//用sum来统计在此区间内有多少个闰年.
        for(int i=startt;i<=endd;i++)
            if(i%400==0||(i%100!=0&&i%4==0))
            sum++;
        return sum;
    }
    
    
    int main()//主函数终于开始了,上面四个函数让我编了2小时
    {
        int year,month,day;//定义了三个变量,分别储存年月日
        cin>>year>>month>>day;//分别存储输入
        cout<<year_day(year,month,day)+month_day(year,month,day)+day_day(year,month,day)+runnian(year,2022);//最后相加。
    }
    //为大家删除了一些多余的括号,改了下格式,更赏心悦目。
    //如果大家有任何简化的方法,直接回复就可以啊。
    //既然你能翻到,就请点个赞看完再抱走吧。代码比较长,有90多行,但第一:能AC,第二:简单易懂,他就是刚学完第一年前4单元也能看懂(能不能写出来看个人情况)
    
    
    
    • @ 2023-8-6 11:00:45

      大家点完赞再抱走吧,求求了,编写很不容易哒。[求求]

    • @ 2023-8-6 11:01:30

      应该是这里边最长的一个了,但是是可以AC哒

    • @ 2023-8-21 10:51:54

      感谢大家的支持😄

  • 15
    @ 2023-3-19 22:32:10

    P1007 求日龄

    题目描述

    年龄是指一个人出生后以年为长度计算的时间整数值。

    同理,日龄指一个人出生后以日为长度计算的时间整数值

    请求出给定日期出生的人,到 2022 年 10 月 20 日的日龄吧。


    思路

    需要用到多个函数:

    1.判断闰年

    凡公历中有闰日(2月29日)的年份,阴阳历中有闰月的年份。

    1582年以来公历的置闰规则:

    普通闰年:公历年份是4的倍数,且不是100的倍数的,为闰年(如2004年、2020年等就是闰年)。

    世纪闰年:公历年份是整百数的,必须是400的倍数才是闰年(如1900年不是闰年,2000年是闰年)。

    1582年以前的惯例:四年一闰;如果公元A年的A(正数)能被4整除,那么它就是闰年;如果公元前B年的B(正数)除以4余1,那么它也是闰年。

    (1)四年一闰百年不闰:即如果year能够被4整除,但是不能被100整除,则year是闰年。 (2)每四百年再一闰:如果year能够被400整除,则year是闰年。

    可以根据这些编出来:

    int leap_year(int n)
    {
        if(n % 400 == 0)
        {
            return true;
        }
        else if(n % 4 == 0 && n % 100 != 0)
        {
            return true;
        }
        else
        {
            return false;
        }
    }
    

    2.判断是第几天函数

    int day_in_year(int y,int m,int d)
    {
        int ans = 0;
        for(int i = 1;i <= m - 1;i++)
        {
            ans += days[i] + (leap_year(y) && i == 2);
        }
        ans += d;
        return ans;
    }
    

    不过这里就需要用一个数组:

    int days[] = {0,31,28,31,30,31,30,31,31,30,31,30,31};

    把他们穿起来:

    int y,m,d;
        cin >> y >> m >> d;
        int a = day_in_year(y,m,d);
        int b = 293;
        for(int i = y;i < 2022;i++)
        {
            c += 365 + leap_year(i);
        }
        cout << c + b - a;
    

    -搞定!


    参考代码:

    #include <iostream>//hetao3097453
    using namespace std;
    int days[] = {0,31,28,31,30,31,30,31,31,30,31,30,31};
    int c;
    int leap_year(int n)
    {
        if(n % 400 == 0)
        {
            return true;
        }
        else if(n % 4 == 0 && n % 100 != 0)
        {
            return true;
        }
        else
        {
            return false;
        }
    }
    int day_in_year(int y,int m,int d)
    {
        int ans = 0;
        for(int i = 1;i <= m - 1;i++)
        {
            ans += days[i] + (leap_year(y) && i == 2);
        }
        ans += d;
        return ans;
    }
    int main()
    {
        int y,m,d;
        cin >> y >> m >> d;
        int a = day_in_year(y,m,d);
        int b = 293;
        for(int i = y;i < 2022;i++)
        {
            c += 365 + leap_year(i);
        }
        cout << c + b - a;
        return 0;
    }
      
    

    hetao3097453(bililili @ 一钩出站)

    2023年3月19日

  • 15
    @ 2023-3-18 19:52:32

    第一题应改为【挑战题】

    • @ 2023-5-28 14:56:38

    • @ 2023-6-18 17:35:37

      赞同 × 100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

    • @ 2024-3-28 20:55:17

      @你这多少个0啊

    • @ 2024-4-6 20:54:43

      没错×999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999

    • @ 2024-5-19 22:10:04

      点赞x999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999(刷屏王,一千个9)

  • 9
    @ 2023-3-1 14:56:47
    题目大意
            求输入日期到2022年4月20日之间,有多少天。

    完整思路
            记输入日期所处年份为A,输入日期在那一年已经过了a天,终止日期所处年份为B,终止日期在那一年已经过了b天,A到B之间有c天,根据数轴上的标识,最终的答案就是c+b-a。

            所以,整个程序需要实现两个操作:

            1. 计算给定日期是当前年份的第几天。

            2. 计算输入年到终止年之间有几天。

    核心代码
    
    //计算当前日期在当年是第几天
    int Month[13] = {-1, 31, -1, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
    int day(int year, int month, int day)
    {
        int sum = 0;
        if (year % 100 == 0 && year % 400 == 0)
            Month[2] = 29;
        else if (year % 100 != 0 && year % 4 == 0)
            Month[2] = 29;
        else
            Month[2] = 28;
        for (int i = 1; i <= month - 1; i++)
        {
            sum += Month[i];
        }
        return sum + day;
    }
    
    
    //计算输入年到终止年之间有几天
    int Month[13] = {-1, 31, -1, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
    for (int i = start_year; i <= end_year - 1; i++)
    {
        if (i % 100 == 0 && i % 400 == 0)
            Month[2] = 29;
        else if (i % 100 != 0 && i % 4 == 0)
            Month[2] = 29;
        else
            Month[2] = 28;
        for (int j = 1; j <= 12; j++)
        {
            num += Month[j];
        }
    }
    
    
    • 8
      @ 2023-7-4 17:02:30

      题目描述

      年龄是指一个人出生后以年为长度计算的时间整数值。

      同理,日龄指一个人出生后以日为长度计算的时间整数值。

      请求出给定日期出生的人,到 2022 年 10 月 20 日的日龄吧。

      输入格式

      一个日期,表示这个人的生日

      输入日期一定在 2022-10-20 之前

      输出格式

      日龄

      这题有仨难点:

      判断是否是闰年 要求: year%4=0 and year%1000 或者 year%400=0 因此函数体是这样的:

      bool pr(int y){
          if((y%4==0 && y%100!=0)||(y%400==0))return true;
          else return false;
      }
      

      如何累加ans(我程序里写的是sum)

      由于bool里1=true,0=false,所以可以这样编:

      for(int i=year+1;i<=2021;i++)
              sum+=365+pr(i);
      

      此时得到的并不是对的 如果year!=2022: sum+=2022.1.1~2022.10.20 我按了按293 image 还要减一呢 还要加他降世年的天数:

      if(year!=2022){
          if(pr(year))yue[2]=29;
          for(int i=month+1;i<=12;i++)sum+=yue[i];
          sum+=yue[month]-day+1;
          cout<<sum+293-1;
      }
      

      else year==2022: 跟上面推导的差不多:

      else{
          for(int i=month+1;i<=9;i++)sum+=yue[i];
          sum+=21-day;
          cout<<sum-1;
      }
      
      难点就这些,下面看全代码:
      int day,month,year,yue[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};//定义年份
      long long sum;
      bool pr(int y){
          if((y%4==0 && y%100!=0)||(y%400==0))return true;
          else return false;
      }
      int main(){
          cin>>year>>month>>day;
          for(int i=year+1;i<=2021;i++)
              sum+=365+pr(i);
          if(year!=2022){
              if(pr(year))yue[2]=29;
              for(int i=month+1;i<=12;i++)sum+=yue[i];
              sum+=yue[month]-day+1;
              cout<<sum+293-1;
          }else{
              for(int i=month+1;i<=9;i++)sum+=yue[i];
              sum+=21-day;
              cout<<sum-1;
          }
          return 0;
      
      • 7
        @ 2023-3-19 10:04:43
        #include <bits/stdc++.h>
        using namespace std;
        int y, m, d,sum;
        int main()
        {
        	int a[15]={0,31,28,31,30,31,30,31,31,30,31,30,31};
            cin >> y >> m >> d;
            if(y<2022){
        		if((((y%4)==0) && ((y%100)!=0)) || (y%400==0)){
                	a[2]=29;
            	}
        		sum+=(a[m]-d);
        		for(int i=m+1;i<=12;i++){
        			sum+=a[i];
        		}
        		for(int i=y+1;i<2022;i++){
                	if((((i%4)==0) && ((i%100)!=0)) || (i%400==0)) sum+=366;
                	else sum+=365;
            	}
        		sum += 293;//293是2022 1 1 到 2022 10 20 的天数
        	}
        	if(y==2022){
        		a[2]=28;
        		sum+=(20-d);
        		for(int i=m+1;i<=10-1;i++){
        			sum+=a[i];
        		}
        	}
        	cout<<sum;
        	return 0;
        }
        //正确思路,满分答案
        
        • 5
          @ 2023-7-25 23:10:18

          -题目回顾-

          年龄是指一个人出生后以年为长度计算的时间整数值。

          同理,日龄指一个人出生后以日为长度计算的时间整数值。

          请求出给定日期出生的人,到 2022 年 10 月 20 日的日龄吧。

          -分析-

          给一个日期,算出到2022年10月20日的所有天数,我们不妨先把给定的日期y年m月d日清零到y年0月0日,接下来,我们枚举出从y年到2021年的所有天数(因为2022年没有过完,所以枚举到2021年)最后再加上2022年从1月1日到10月20日的所有天数即可~

          -摆摆龙门阵-

          话说今天这题怎么这么难呢…………

          #include <bits/stdc++.h>
          using namespace std;
          int y, m, d, ans;
          int main()// by AGOMG
          {
              cin >> y >> m >> d;
              for(int i = y; i <= 2021; i++)
              {
                  if((i % 4 == 0 && i % 100 != 0) || i % 400 == 0)
                  {
                      ans += 366;
                  }
                  else
                  {
                      ans += 365;
                  }
              }//枚举从y年到2021年的所有天数
              for(int i = 1; i <= m - 1; i++)
              {
                  if(i == 2)
                  {
                      ans -= 28;
                      if((y % 4 == 0 && y % 100 != 0) || y % 400 == 0)
                      {
                          ans -= 1;
                      }
                  }
                  else if((i % 2 == 1 && i <= 7) || (i % 2 == 0 && i >= 8))
                  {
                      ans -= 31;
                  }
                  else
                  {
                      ans -= 30;
                  }
              }//清零(把y年m月d日清零为y年0月0日)
              ans -= d;
              ans += 293;//2022年从1月1日到10月20日的所有天数
              cout << ans << endl;
              return 0;
          }
          
          • 4
            @ 2023-8-5 19:37:13

            来个没函数的题解

            #include <bits/stdc++.h>
            using namespace std;
            int main()
            {
                int p[14] = {0,31,59,90,120,151,181,212,243,273,304,334,365,0};//平年月份累加天数
                int r[14] = {0,31,60,91,121,152,182,213,244,274,305,335,366,0};//闰年月份累加天数
                int a,b,c,sum = 0;
                cin >> a >> b >> c;
                if (a == 2022)
                {
                    cout << p[9] - p[b -1] + 20 - c;
                    return 0;
                }
                if ((a % 4 == 0 && a % 100 != 0) || a % 400 == 0)//前面不到一年闰时
                {
                    sum += r[12] - r[b - 1] - c;
                }
                else
                {
                    sum += p[12] - p[b-1] - c;//不闰时
                }
                for (int i = a + 1;i < 2022;i++)//整年的部分
                {
                    if (i % 4 == 0 && i % 100 != 0)
                    {
                        sum += 366;
                        continue;
                    }
                    else if (i % 400 == 0)
                    {
                        sum += 366;
                        continue;
                    }
                    else
                    {
                        sum += 365;
                    }
                }
                sum += 293;//最后10个月零20天
                cout << sum;//输出总和
                return 0;
            }
            

            已AC

            • 4
              @ 2023-5-28 17:43:10

              该问题需要计算从给定日期出生的人到2022年10月20日的日龄。下面是解题的思路:

              1. 定义一个函数calculateAge,该函数接收三个参数yearmonthday,表示出生日期的年、月、日。
              2. calculateAge函数内部,定义一个变量age,初始值为0,用于记录日龄。
              3. 创建一个数组month,用于存储每个月的天数。
              4. 使用循环遍历年份,从给定年份开始到2022年。
              5. 在循环中,根据是否为闰年更新二月的天数。
              6. 将每年的天数累加到age中,如果是闰年则累加366,否则累加365。
              7. 使用循环遍历月份,从1到给定月份的前一个月。
              8. 将每个月的天数从age中减去。
              9. 使用循环遍历日份,从1到给定日期的前一天。
              10. 将每天的天数从age中减去。
              11. 最后,从age中减去72,表示从2022年10月20日到当天的日龄。
              12. 返回age作为结果。
              13. 在主函数中,读取输入的出生日期,并调用calculateAge函数计算结果。
              14. 输出结果。

              该解题过程通过逐年累加天数、逐月减去天数、逐日减去天数的方式计算日龄,最后减去固定的72天得到最终结果。


              上代码

              #include <iostream>
              using namespace std;
              
              long long calculateAge(int year, int month, int day) {
                  long long age = 0;
                  int monthDays[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
              
                  if (year % 400 == 0 || (year % 100 != 0 && year % 4 == 0)) {
                      monthDays[1] = 29; // Update February days to 29
                  }
                  for (int y = year; y <= 2022; y++) {
                      if (y % 400 == 0 || (y % 100 != 0 && y % 4 == 0)) {
                          age += 366; // Leap year
                      } else {
                          age += 365; // Non-leap year
                      }
                  }
                  for (int m = 0; m < month - 1; m++) {
                      age -= monthDays[m];
                  }
                  for (int d = 1; d <= day; d++) {
                      age--;
                  }
                  age -= 72; // Subtract 72 days from 2022-10-20 to the current day
                  return age;
              }
              
              int main() {
                  int year, month, day;
                  cin >> year >> month >> day;
                  long long age = calculateAge(year, month, day);
                  cout << age << endl;
                  return 0;
              }
              
              
              • 3
                @ 2023-10-20 20:03:53

                C2每课一题解(第三课 第一题)!!!

                此题还算简单,只需用这节课的知识——循环枚举。

                话不多说,上代码!

                AC Code

                #include <bits/stdc++.h>
                using namespace std;
                long long ae(int year, int month, int day) 
                {
                    long long a = 0;
                    int monthDays[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
                    if (year % 400 == 0 || (year % 100 != 0 && year % 4 == 0)) {
                        monthDays[1] = 29; 
                    }
                    for (int y = year; y <= 2022; y++) 
                    {
                        if (y % 400 == 0 || (y % 100 != 0 && y % 4 == 0)) 
                        {
                            a += 366; 
                        } else 
                        {
                            a += 365; 
                        }
                    }
                    for (int m = 0; m < month - 1; m++) 
                    {
                        a -= monthDays[m];
                    }
                    for (int d = 1; d <= day; d++) 
                    {
                        a--;
                    }
                    a -= 72;
                    return a;
                }
                int main() {
                    int year, month, day;
                    cin >> year >> month >> day;
                    long long s = ae(year, month, day);
                    cout << s << endl;
                    return 0;
                }
                
                • 2
                  @ 2024-5-13 23:16:17

                  设出生年月日分别为y,m,d 把题目分成两种情况:年数==2022 和年数 < 2022 如果年数<2022,把要求的数分为三部分, sum = 2022.1.1~2022.10.20 + y.1.1 ~2021.12.29 -y.1.1 ~ y.m.d

                  1. 293天(2022.1.1~2022.10.20)
                  2. 出生年至2021年的所有365(或366)天,这之中的天数包括了出生年的一月一日至出生日,而我们要把这段时间减去
                  3. 减去多余天数

                  如果年数等于2022, sum = 2022.1.1~2022.10.20 - 2022.1.1 ~ 2022.m.d

                  1. 累加一月一日到出生日所有天数(2022.1.1~2022.m.d)
                  2. 用293天(2022.1.1~2022.10.20)减去一月一日到出生日所有天数,即得2022.m.d ~ 2022.10.20天数
                  #include<bits/stdc++.h>
                  using namespace std;
                  int y,m,d,sum;
                  bool run(int year){//判断闰年
                      return (year%4==0&&year%100!=0)||year%400==0;
                  }
                  int days_in_month(int month){//计算此月天数
                      if(month==4||month==6||month==9||month==11) return 30;
                      else if(month==2){
                          if(run(y)) return 29;
                          else return 28;
                      }
                      else return 31;
                  }
                  int main(){
                      cin>>y>>m>>d;
                      if(y<2022){
                          sum+=293;
                          for(int i=y;i<2022;i++){
                              sum+=365;
                              if(run(i)) sum++;
                          }
                          for(int i=1;i<=m;i++){
                              sum-=days_in_month(i);
                          }   
                          sum+=days_in_month(m)-d;
                          cout<<sum;
                      }
                      else{
                          for(int i=1;i<=m-1;i++){
                              sum+=days_in_month(i);
                          }
                          sum+=d;
                          cout<<293-sum;
                      }
                      return 0;
                  }
                  
                  • 2
                    @ 2024-1-26 9:44:42
                    #include <bits/stdc++.h>
                    using namespace std;
                    int main()
                    {
                        int a,b,c;
                        int num=0;
                        cin>>a>>b>>c;
                        int k=2022;
                        
                        for(int i=k;i>=(a+1);i--)
                        {
                            if(i%400==0 || (i%4==0 && i%100!=0))
                            {
                                num+=366;
                            }
                            
                            else
                            {
                                num+=365;
                            }
                        }
                        
                        if(b==01 || b==03 || b==05 || b==07 || b==8 || b==10 || b==12)
                        {
                            num+=(31-c);
                        }
                        else if(b==04 || b==06 || b==9 || b==11)
                        {
                            num+=(30-c);
                        }
                        else
                        {
                            if(a%400==0 || (a%4==0 && a%100!=0))
                            {
                                num+=(29-c);
                            }
                            else
                            {
                                num+=(28-c);
                    
                            }
                        }
                        
                            
                        for(int i=(b+1);i<=12;i++)
                        {
                            if(i==1 || i==3 || i==5 || i==7 || i==8 || i==10 || i==12)
                            {
                                num+=31;
                            }
                            else if(i==4 || i==6 || i==9 || i==11)
                            {
                                num+=30;
                            }
                            else
                            {
                                if(a%400==0 || (a%4==0 && a%100!=0))
                                {
                                    num+=29;
                                }
                                else
                                {
                                    num+=28;
                    
                                }
                            }
                        }
                        if(a==2022)
                        {
                            
                            for(int i=b;i<10;i++)
                            {
                                if(b==01 || b==03 || b==05 || b==07 || b==8 || b==10 || b==12)
                                {
                                    num+=31;
                                }
                                else if(b==02 || b==04 || b==06 || b==9)
                                {
                                    num+=30;
                                }
                                else
                                {
                                    if(a%400==0 || (a%4==0 && a%100!=0))
                                    {
                                        num+=29;
                                    }
                                    else
                                    {
                                        num+=28;
                    
                                    }
                                }
                            }
                            num+=(20-c);
                        }
                        num-=72;
                        cout<<num;
                    }
                    
                    • 2
                      @ 2024-1-6 17:08:55
                      #include <iostream>
                      #include <bits/stdc++.h>
                      #include <stdio.h>
                      #include <iomanip>
                      using namespace std;
                      int days[] = {0,31,28,31,30,31,30,31,31,30,31,30,31};
                      int c;
                      int leap_year(int n)
                      {
                         if(n % 400 == 0)
                         {
                            return true;
                         }
                         else if(n % 4 == 0 && n % 100 != 0)
                         {
                            return true;
                         }
                         else
                         {
                            return false;
                         }
                      }
                      int day_in_year(int y,int m,int d)
                      {
                         int ans = 0;
                         for(int i = 1;i <= m - 1;i++)
                         {
                            ans += days[i] + (leap_year(y) && i == 2);
                         }
                         ans += d;
                         return ans;
                      }
                      int main()
                      {
                         int y,m,d;
                         cin >> y >> m >> d;
                         int a = day_in_year(y,m,d);
                         int b = 293;
                         for(int i = y;i < 2022;i++)
                         {
                            c += 365 + leap_year(i);
                         }
                         cout << c + b - a;
                         return 0;
                      }
                      
                      • 2
                        @ 2023-10-22 15:08:39
                        #include<bits/stdc++.h>
                        using namespace std;
                        int n,y,r,s,yt[15]{0,31,28,31,30,31,30,31,31,30,31,30,31};
                        //建个数组遍历,用于月的遍历。 
                        int main(){
                        	cin>>n>>y>>r;
                        	if(n==2022){//特殊条件 
                        		if(y!=10)s+=yt[y]-r;//非十月 
                        		for(int i=y+1;i<10;i++)s+=yt[i];
                        		if(y!=10)s+=20;//非十月
                        		if(y==10)s+=20-r;//非十月
                        		cout<<s;
                        		return 0; 
                        	}
                        	s+=yt[y]-r;//完成这个月 
                        	for(int i=y+1;i<=12;i++)s+=yt[i];//完成这年 
                        	for(int i=n+1;i<2022;i++){//年遍历到2022
                        		if((i%100!=0&&i%4==0)||(i%400==0)){
                        			s+=366;//平年 
                        		}
                        		else s+=365;//闰年 
                        	}
                        	if((n%100!=0&&n%4==0)||(n%400==0))yt[3]=29;//闰年二月 
                        	for(int i=1;i<10;i++){//月遍历到10 
                        		s+=yt[i+1];
                        	}
                        	s+=20;//加上20天 
                        	cout<<s;
                        }
                        
                        • 2
                          @ 2023-8-5 22:40:31

                          来一个与众不同的题解!!!!

                          #include <bits/stdc++.h> 
                          using namespace std;
                          int month[13] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
                          int main()
                          {
                              int n, y, r, sum = 0;
                              cin >> n >> y >> r;
                              int s = n * 10000 + y * 100 + r;
                              for (int i = n; i <= 2022; i++)
                              {
                                  if ((i % 4 == 0 && i % 100 != 0) || (i % 400 == 0))
                                  {
                                      month[2] = 29;
                                  }
                                  else
                                  {
                                      month[2] = 28;
                                  }
                                  for (int j = 1; j <= 12; j++)
                                  {
                                      for (int k = 1; k <= month[j]; k++)
                                      {
                                          int f = i * 10000 + j * 100 + k;
                                          if (f > s && f <= 20221020)
                                          {
                                              sum++;
                                          }
                                      }
                                  }
                              }
                              cout << sum;
                              return 0;
                          }
                          
                          • 2
                            @ 2023-8-5 19:39:37

                            题解

                            #include <bits/stdc++.h>
                            using namespace std;
                            int ans;
                            int month1[100] = {0,31,28,31,30,31,30,31,31,30,31,30,31};
                            int month2[100] = {0,31,29,31,30,31,30,31,31,30,31,30,31};
                            bool runnian(int q)
                            {
                                if( q % 400 == 0 )
                                {
                                    return true;
                                }
                                if( ( q % 4 == 0 ) and (q % 100 != 0 ) )
                                {
                                    return true;
                                }
                                else
                                {
                                    return false;
                                }
                            }
                            int main()
                            {
                                int a , s , d;
                            	cin >> a >> s >> d;
                            	if( a < 2022 )
                            	{
                            		if( runnian(a) )
                            		{
                            			ans += month2[s] - d;
                            			for( int i = s + 1 ;i <= 12 ; i++ )
                            			{
                            				ans += month2[i];
                            			}
                            		}
                            		else
                            		{
                            			ans += month1[s] - d;
                            			for( int i = s + 1 ; i <= 12 ; i++ )
                            			{
                            				ans += month1[i];
                            			}
                            		}
                            		for( int i = a + 1 ; i < 2022 ; i++ )
                            		{
                            			if(runnian(i))
                            			{
                            				ans += 366;
                            			}
                            			else
                            			{
                            				ans += 365;
                            			}
                            		}
                            		ans += 293;
                            	}
                            	else
                            	{
                            		ans += month1[s] - d;
                            		for( int i = s + 1 ; i < 10 ; i++ )
                            		{
                            			ans += month1[i];
                            		}
                            		ans += 20;
                            	}
                            	cout << ans;
                            	return 0;
                            }
                            
                            • 2
                              @ 2023-3-19 0:09:15

                              思路和代码的含义在下面,请尽量自己编写 编辑不易,且看且珍惜

                              #include <bits/stdc++.h>
                              using namespace std;
                              int month[15];
                              int main()
                              {
                              	month[1]=31, month[2]=28, month[3]=31, month[4]=30, month[5]=31, month[6]=30, month[7]=31, month[8]=31, month[9]=30, month[10]=31, month[11]=30, month[12]=31;//每月总天数
                                  int x, y, z;//定义年、月、日的变量
                                  int sum = 0;//定义日龄
                                  cin >> x >> y >> z;//输入年、月、日的变量
                                  if(x<2022)
                              	{
                              		sum += (2022-x) * 365;//年的总天数(不包括闰年)
                              		sum += (2024-x) / 4;//加上这期间闰年多的一天 
                              		sum -= (2100-x) / 100;//去掉100倍数的年份(不是闰年)的一天
                              		sum += (2400-x) / 400;//加上被去掉但是是400倍数的年份(是闰年)的一天
                              	}
                              	sum += 293;//2020年这年中10月和20日的天数
                              	if (x % 4 == 0)//判断闰年 
                              	{
                              		if (x % 100 != 0 || x % 400 == 0)//判断闰年
                              		{
                              			for (int i = 1; i < y; i++)//若是闰年则多减一天
                              			{
                              				if (i == 2)
                              				{
                              					sum -= 29;
                              				}
                              				else
                              				{
                              					sum -= month[i];
                              				}
                              			}
                              			sum -= z;
                              		}
                              	}
                              	else//减掉前面年份天数多加的天数
                              	{
                              		for (int i = 1; i < y; i++)
                              		{
                              			sum -= month[i];
                              		}
                              		sum -= z;
                              	}
                              	cout << sum;//输出
                              }
                              
                              • 1
                                @ 2023-4-5 14:15:39

                                题解来喽!!!

                                #include <iostream>//hetao3097453
                                using namespace std;
                                int days[] = {0,31,28,31,30,31,30,31,31,30,31,30,31};
                                int c;
                                int leap_year(int n)
                                {
                                    if(n % 400 == 0)
                                    {
                                        return true;
                                    }
                                    else if(n % 4 == 0 && n % 100 != 0)
                                    {
                                        return true;
                                    }
                                    else
                                    {
                                        return false;
                                    }
                                }
                                int day_in_year(int y,int m,int d)
                                {
                                    int ans = 0;
                                    for(int i = 1;i <= m - 1;i++)
                                    {
                                        ans += days[i] + (leap_year(y) && i == 2);
                                    }
                                    ans += d;
                                    return ans;
                                }
                                int main()
                                {
                                    int y,m,d;
                                    cin >> y >> m >> d;
                                    int a = day_in_year(y,m,d);
                                    int b = 293;
                                    for(int i = y;i < 2022;i++)
                                    {
                                        c += 365 + leap_year(i);
                                    }
                                    cout << c + b - a;
                                    return 0;
                                }
                                

                                以上来自@ 非原创

                                • 1
                                  @ 2023-3-19 20:50:22
                                  #include <bits/stdc++.h>//点个赞,谢谢!
                                  using namespace std;
                                  int a,b,c,sum=0;
                                  int main()
                                  {
                                  	int s[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
                                      cin >>a>>b>>c;
                                      if(a<2022)
                                  	{
                                  		if((((a%4)==0)&&((a%100)!=0))||(a%400==0))
                                  		{
                                          	s[2]=29;
                                      	}
                                  		sum+=(s[b]-c);
                                  		for(int i=b+1;i<=12;i++)
                                  		{
                                  			sum+=s[i];
                                  		}
                                  		for(int i=a+1;i<2022;i++)
                                  		{
                                          	if((((i%4)==0) && ((i%100)!=0)) || (i%400==0))
                                  			{
                                  				sum+=366;
                                  			}	
                                          	else
                                  			{ 
                                  				sum+=365;
                                  			}
                                      	}
                                  		sum+=293;
                                  	}
                                  	if(a==2022)
                                  	{
                                  		s[2]=28;
                                  		sum+=(20-b);
                                  		for(int i=b+1;i<=10-1;i++)
                                  		{
                                  			sum+=s[i];
                                  		}
                                  	}
                                  	cout<<sum;
                                  	return 0;
                                  }
                                  
                                  • @ 2023-3-24 20:04:53

                                    这不是我代码吗 就改了变量和括号位置我又不是看不出来

                                信息

                                ID
                                1
                                时间
                                1000ms
                                内存
                                256MiB
                                难度
                                6
                                标签
                                递交数
                                5233
                                已通过
                                1493
                                上传者