本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。
小明特别喜欢顺子。顺子指的就是连续的三个数字:123、456 等。顺子日期指的就是在日期的 yyyymmdd 表示法中,存在任意连续的三位数是一个顺子的日期。例如 20220123 就是一个顺子日期,因为它出现了一个顺子:123; 而 20221023 则不是一个顺子日期,它一个顺子也没有。小明想知道在整个 2022 年份中,一共有多少个顺子日期?
解题思路:枚举 2022 年所有的日期,然后判断是否存在顺子即可。
本题的顺子为顺序的三位数,包括 012,123,234,345,456,567,678,789。由于是 2022 年的日期,顺子只可能是 012 和 123,其余顺子不可能出现,因为其余均为非法日期。
最终只需枚举月、日,然后 check 一下每个日期中是否存在上述顺子即可。
#include
#include
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;
}
#include
#include
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变为字符串
{
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)//找字符串函数
{
int flag=0;//flag=3说明找到了
while(*str!=0)
{
if(*str==*arr)
{
arr++;
flag++;
}
else
{
str=str-flag;//退回到原来的那一位,然后下面会str++进入到下一位
/* 20220112
下标0123456
6-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;
}
#include
#include
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;
}
思路:数组的前四个已经确定为2022,然后枚举日期合法性,将日期存入数组中,判断第5,第6,第7个元素是否满足+1,判断第6,第7,第8个元素是否满足+1即可
#include
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;
}