36 条题解
-
108
题目P1007 求日龄
这是本蒟蒻的第一篇题解,请多多
点赞关照
题目解析
这题其实很好理解 意为求从输入的年份到2022年10月20日一共多少天(作者本人生日在10月21日)
点明思路
许多同学也许回想到从出生日开始一天一天算到2022.10.20,但这非常耗时,可能会TLE(超时),所以我们要用点脑子,以下是我的思路: 将所有时间分成3段分别为:
- 出生这一年的天数;
- 从出生这一年+1到2019年的天数;
- 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; }
相信各位一定听懂了吧,别忘了点赞
-
37
//代码有亿点长,我看了看大家的思路,目前没有这种思路,我就发出来了,有一些些的绕。让我来解释一下吧。 //我的思路是先算有几整年(几个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单元也能看懂(能不能写出来看个人情况)
-
15
P1007 求日龄
题目描述
年龄是指一个人出生后以年为长度计算的时间整数值。
同理,日龄指一个人出生后以日为长度计算的时间整数值。
请求出给定日期出生的人,到 2022 年 10 月 20 日的日龄吧。
思路
需要用到多个函数:
1.判断闰年
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日
-
9
题目大意
求输入日期到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
题目描述
年龄是指一个人出生后以年为长度计算的时间整数值。
同理,日龄指一个人出生后以日为长度计算的时间整数值。
请求出给定日期出生的人,到 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 还要减一呢 还要加他降世年的天数:
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
#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
-题目回顾-
年龄是指一个人出生后以年为长度计算的时间整数值。
同理,日龄指一个人出生后以日为长度计算的时间整数值。
请求出给定日期出生的人,到 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
来个没函数的题解
#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
该问题需要计算从给定日期出生的人到2022年10月20日的日龄。下面是解题的思路:
- 定义一个函数
calculateAge
,该函数接收三个参数year
、month
和day
,表示出生日期的年、月、日。 - 在
calculateAge
函数内部,定义一个变量age
,初始值为0,用于记录日龄。 - 创建一个数组
month
,用于存储每个月的天数。 - 使用循环遍历年份,从给定年份开始到2022年。
- 在循环中,根据是否为闰年更新二月的天数。
- 将每年的天数累加到
age
中,如果是闰年则累加366,否则累加365。 - 使用循环遍历月份,从1到给定月份的前一个月。
- 将每个月的天数从
age
中减去。 - 使用循环遍历日份,从1到给定日期的前一天。
- 将每天的天数从
age
中减去。 - 最后,从
age
中减去72,表示从2022年10月20日到当天的日龄。 - 返回
age
作为结果。 - 在主函数中,读取输入的出生日期,并调用
calculateAge
函数计算结果。 - 输出结果。
该解题过程通过逐年累加天数、逐月减去天数、逐日减去天数的方式计算日龄,最后减去固定的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
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
设出生年月日分别为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
- 293天(2022.1.1~2022.10.20)
- 出生年至2021年的所有365(或366)天,这之中的天数包括了出生年的一月一日至出生日,而我们要把这段时间减去
- 减去多余天数
如果年数等于2022, sum = 2022.1.1~2022.10.20 - 2022.1.1 ~ 2022.m.d
- 累加一月一日到出生日所有天数(2022.1.1~2022.m.d)
- 用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
#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
#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
#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
来一个与众不同的题解!!!!
#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
题解
#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
思路和代码的含义在下面,请尽量自己编写 编辑不易,且看且珍惜
#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
题解来喽!!!
#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
#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; }
信息
- ID
- 1
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 6
- 标签
- 递交数
- 5232
- 已通过
- 1492
- 上传者