赞
踩
前言:
小明特别喜欢顺子。顺子指的就是连续的三个数字: 123.456等。顺子日期指的就是在日期的 yyyymmdd 表示法中存在任意连续的三位数是一个顺子的日期。例如 20220123就是一个顺子日期,因为它出现了一个顺子: 123; 而20221023 则不是一个顺子日期,它一个顺子也没有。小明想知道在整个 2022 年份中,一共有多少个顺子日期?
题目要求为2022年,因此我们只需要考虑月份和天数这两者就可以了,这两者有4个数字。我们也要考虑2022年是闰年还是平年,闰年的二月有29天,平年有28天。
首先先建立一个月份数组,分别表示12个月份中的天数
int months[]={31,28,31,30,31,30,31,31,30,31,30,31}; //平年的12月天数
然后判断一年是闰年还是平年(闰年返回true,平年返回false):
- bool check(int year){
- if(year%100==0){
- if(year%400==0){
- return true;
- }
- else{
- return false;
- }
- }
- else{
- if(year%4==0){
- return true;
- }
- else{
- return false;
- }
- }
- }
获取月份的字符串形式
- string get_string(int x){
- string ans="";
- if(x<10){
- //x是3
- ans+="0";
- ans+=(char)('0'+x);
- }
- else{
- //12
- int tmp1=x/10;
- int tmp2=x%10;
- ans+=(char)('0'+tmp1);
- ans+=(char)('0'+tmp2);
- }
- return ans;
- }
传入一个月份或者天数(类型为整数),如果为一位数,则需要添加数字0在这个数前面,如果为两位数就不用,如:一月一日0101和十月十日1010。
有人可能会有疑问:为什么将整形x强制转换为字符类型时要先加一个'0'呢?为什么不能是下面这样呢?
ans=(char)(x);
这就要提到类型的转换有精度的损失这个问题上了。
我们都知道C语言可以强制类型转换,今天就让我们看看int和char之间的转换。
例如:
- #include<stdio.h>
- int main(){
- int a = 9;
- char b = '8';
- printf("%c\n",(char)a);
- printf("%d",(int)b);
- return 0;
- }
运行结果为:
出乎我们的意料,简直跟我们所想要的答案完全不一样
(1)从长字节数据类型转换为短字节数据类型,会产生截断:
如从4字节的int类型转换成1个字节的char类型,则取int数据的最低的一个字节。
(2)从短字节类型转换为长字节类型
从char转换为int:则在前面的三个字节补符号位,即补上0xffffff(char的首位为1),或0x000000(char的首位为0)。
- #include<stdio.h>
- int main(){
- int a = 9;
- char b = '8';
- printf("%c\n",(char)(a+'0'));
- printf("%d",(int)(b-'0'));
- return 0;
- }
运行结果:
————————————————
版权声明:本文为CSDN博主「大佬也拖不动的油瓶」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_48089202/article/details/116277817
判断顺子,传入的是一整串格式正确的日期字符串
变量cnt用于标记一个顺子的长度,last作顺子末端位置,it是迭代器。
- int get_ans(string x){
- int cnt=0;
- char last;
- for(auto it:x){
- if(cnt==0){
- cnt=1;
- last=it;
- }
- else{
- if(it-last==1){
- cnt+=1;
- last=it;
- }
- else{ //0 1 3
- cnt=1;
- last=it;
- }
- }
- if(cnt>=3){
- return 1;
- }
- }
- return 0;
- }
然后获得月份和天数的具体数字,并输出结果:
- void solve(){
- if(check(2022)){
- months[1]+=1;
- }
- int ans=0;
- for(int i=1;i<=12;i++){
- string pre="2022";
- //i是月份
- string month_string=get_string(i);
- for(int j=1;j<=months[i-1];j++){
- //j是天数
- string day_string=get_string(j);
- string final=pre+month_string+day_string;
- ans+=get_ans(final);
- }
- }
- cout<<ans<<"\n";
- }
最后main函数中运行:
- signed main(){
- int t=1;
- while(t--){
- solve();
- }
- }
得到结果:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。