题目:
题目描述:
题目链接:
好数
思路:
第一种思路详解:
因为每次检查数都是从个位开始,所以对于每一个数都是先检查奇数位再检查偶数位,即存在先检查奇数位再检查偶数位的循环。注意一次完整的循环是先检查奇数位再检查偶数位,所以在检查完奇数位后删去这一位可能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;
}