酒泉做網(wǎng)站百度推廣優(yōu)化技巧
文章目錄
- 順子日期
- 問題描述
- 答案:14
- 字符串解題
- C++
- C語言
- 指針
- C語言函數(shù)
- 數(shù)組解題
順子日期
問題描述
本題為填空題,只需要算出結(jié)果后,在代碼中使用輸出語句將所填結(jié)果輸出即可。
小明特別喜歡順子。順子指的就是連續(xù)的三個(gè)數(shù)字:123、456 等。順子日期指的就是在日期的 yyyymmdd 表示法中,存在任意連續(xù)的三位數(shù)是一個(gè)順子的日期。例如 20220123 就是一個(gè)順子日期,因?yàn)樗霈F(xiàn)了一個(gè)順子:123; 而 20221023 則不是一個(gè)順子日期,它一個(gè)順子也沒有。小明想知道在整個(gè) 2022 年份中,一共有多少個(gè)順子日期?
答案:14
字符串解題
解題思路:枚舉 2022 年所有的日期,然后判斷是否存在順子即可。
本題的順子為順序的三位數(shù),包括 012,123,234,345,456,567,678,789。由于是 2022 年的日期,順子只可能是 012 和 123,其余順子不可能出現(xiàn),因?yàn)槠溆嗑鶠榉欠ㄈ掌凇?br /> 最終只需枚舉月、日,然后 check 一下每個(gè)日期中是否存在上述順子即可。
C++
#include<iostream>
#include<string>
using namespace std;//to_string()代碼原理
//string To_string(int n)
//{
// string s;
// while(n!=0)
// {
// s+=n%10+'0';
// n/=10;
// }
// reverse(s.begin(),s.end());
// return s;
//}bool cheak(int year,int month,int day)
{string str=to_string(year);if(month<10) str+='0';str+=to_string(month);if(day<10) str+='0';str+=to_string(day);return (str.find("012")!=str.npos)||(str.find("123")!=str.npos);//等同于str.find("012")!=-1
}int main()
{int year=2022;int i,j;int ans=0;int months[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};for(i=1;i<=12;i++){for(j=1;j<=months[i];j++){if(cheak(year,i,j)==true){ans++;}}}cout<<ans<<endl;return 0;
}
C語言
指針
#include <stdio.h>
#include <stdlib.h>char str[8];// void reverse(char* left,char* right)//將字符串倒過來
{while(left<right){char tmp=*left;*left=*right;*right=tmp;left++;right--;}
}void to_string(long int num)//將num變?yōu)樽址?
{int i=0;while(num!=0){str[i++]=num%10+'0';num=num/10;}reverse(str,str+8-1);
// puts(str);
}int fun(char* str,char* arr)//找字符串函數(shù)
{int flag=0;//flag=3說明找到了 while(*str!=0){if(*str==*arr){arr++;flag++;}else{str=str-flag;//退回到原來的那一位,然后下面會(huì)str++進(jìn)入到下一位 /* 20220112下標(biāo)01234566-2=4 4++=5*/arr=arr-flag;flag=0;}if(flag==3)// {return 1;}str++;}return 0;
}int check(int year,int month,int day)
{long int num=year*10000+month*100+day;to_string(num);if(fun(str,"012")==1||fun(str,"123")==1){return 1;}return 0;
}int main()
{int year=2022;int manth[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};int i,j;int sum=0;for(i=1;i<=12;i++){for(j=1;j<=manth[i];j++){if(check(year,i,j)==1){sum++;}}}printf("%d",sum);return 0;
}
C語言函數(shù)
#include<stdio.h>
#include<string.h>
int main()
{char a[8];int count=0;int months[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};for(int i=1;i<=12;i++){for(int j=1;j<=months[i];j++){long long sum=2022*10000+i*100+j;sprintf(a,"%lld",sum);if(strstr(a,"012")!=NULL||strstr(a,"123")!=NULL)count++;}}printf("%d",count);return 0;}
數(shù)組解題
思路:數(shù)組的前四個(gè)已經(jīng)確定為2022,然后枚舉日期合法性,將日期存入數(shù)組中,判斷第5,第6,第7個(gè)元素是否滿足+1,判斷第6,第7,第8個(gè)元素是否滿足+1即可
#include<stdio.h>int main()
{int a[8]={2,0,2,2};int month[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};int i,j;int count=0;for(i=1;i<=12;i++){a[4]=i/10;a[5]=i%10;for(j=1;j<=month[i];j++){a[6]=j/10;a[7]=j%10;if((a[4]+1==a[5]&&a[5]+1==a[6])||(a[5]+1==a[6]&&a[6]+1==a[7])){count++;}}}printf("%d",count);return 0;
}