第十五届蓝桥杯 2024 C/C++组 好数
·
题目:
题目描述:


题目链接:
思路:
第一种思路详解:
因为每次检查数都是从个位开始,所以对于每一个数都是先检查奇数位再检查偶数位,即存在先检查奇数位再检查偶数位的循环。注意一次完整的循环是先检查奇数位再检查偶数位,所以在检查完奇数位后删去这一位可能temp就已经为0了,此时就应该马上退出,否则接着判断偶数位但是0也是偶数就会出错。所以在判断奇数位后删去这一位要对temp补上判断才能继续检查偶数位
这是我第一次做这题的思路,现在想想确实有点绕,但是我当时就是这么做出来的
第二种思路详解:
第二种思路会比第一种更好理解
先计算输入的数是几位数,用cnt来记录这个数的位数。然后j从第一位开始遍历第cnt位,用j可以判断当前是奇数位还是偶数位,然后对应判断奇数位是否是奇数,判断偶数位是否是偶数即可
代码:
第一种思路代码详解:
#include<bits/stdc++.h> //万能头
using namespace std;
int main()
{
int n; //题目给的是10^7,一开始打算开long long,后面百度搜int的范围是-2^31~2^31-1
cin>>n; //int的范围大约相当于10^9,所以不开long long也可以
int i;
int count=0;
for(i=1;i<=n;i++)
{
int flag=1; //flag=1表示好数,flag=0表示不是好数
int temp=i;//定义临时变量,因为temp会变化,若用i则while结束后i=0与循环的i=1矛盾,没结果
while(temp!=0) //因为都是从个位开始检查,存在先检查奇数位再检查偶数位的循环
{
if(temp%2==1) //先检查奇数位,若是奇数才继续检查
{
temp/=10; //末尾删去一位
if(temp!=0&&temp%2==1) //末尾删去一位后还存在偶数位且偶数位为奇数,判断不是好数
{
flag=0;
break;
}
else //末尾删去一位后不存在偶数位,比如1,3,5或偶数位为偶数则继续
{
temp/=10; //每判断完一位就要末尾删去一位,一开始忘了这句,debug发现11不行
continue; //回到while的判断语句,像1,3,5这样的就退出while循环
}
}
else //奇数位不是奇数就直接判断不是好数并break退出while循环
{
flag=0;
break;
}
}
if(flag==1)
{
count++;
}
}
cout<<count<<endl;
return 0;
}
第二种思路代码详解:
#include<bits/stdc++.h> //思路与第一次做的时候不太一样,第一次是先检查奇数位(个位开始)再检查偶数位
using namespace std;//而检查奇数位时要检查是否有下一位及下一位是否是奇数,循环结束是看temp是否到0
//而这次二刷是先算每个数的位数,然后从第一位开始遍历
int main()
{
int n;
int ans=0;
cin>>n;
for(int i=1;i<=n;i++)
{
int cnt=0; //定义cnt为数的位数
int temp1=i;
while(temp1!=0)
{
temp1/=10;
cnt++;
}
int flag=1; //flag为1表示是好数,为0表示不是好数
int temp2=i;
for(int j=1;j<=cnt;j++) //从第一位开始遍历
{
if(j%2==1) //判断是奇数位
{
if(temp2%2==1)
{
temp2/=10;
continue;
}
else
{
flag=0;
break;
}
}
if(j%2==0) //判断是偶数位
{
if(temp2%2==0)
{
temp2/=10;
continue;
}
else
{
flag=0;
break;
}
}
}
if(flag==1)
{
ans++;
}
}
cout<<ans<<endl;
return 0;
}
更多推荐
所有评论(0)