題目:
題目描述:
題目鏈接:
好數
思路:
第一種思路詳解:
因為每次檢查數都是從個位開始,所以對于每一個數都是先檢查奇數位再檢查偶數位,即存在先檢查奇數位再檢查偶數位的循環。注意一次完整的循環是先檢查奇數位再檢查偶數位,所以在檢查完奇數位后刪去這一位可能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;
}