給定任意一個正整數,求比這個數大且最小的「不重複數」,「不重複數」的含義是相鄰兩位不相同,例如:1101是重複數,1231是不重複數spa
思路:code
一、前把這個正整數加1,保證求得的數比這個數大blog
二、從左到右開始遍歷加1後的正整數,若是前一個數字與後一個數字相同,則後一個數字須要加1 class
三、若是後一個數字爲9的話,加1會進位,這時可能會引發前面已檢測過的值產生重複,此時,須要從新遍歷效率
四、加1後,爲保證值最小,則後面數值以10101010...填充遍歷
代碼:方法
//方法一,直接+1判斷是否符合 //但如11011011011時,效率過低 int GetMin(int a){ int k,l; while(1){ k=++a; l=k%10; k/=10; while(k){ if(l==k%10){ break; }else{ l=k%10; k/=10; } } if(k==0)return a; } } //方法二,也就是本文所寫的思路 //直接觀察數的各個數字規律求解 int GetMin2(int a){ int tri=1; int front,back; for(int i=a;i>10;i/=10)tri*=10; while(tri>1){ front=a/tri%10; back=a/(tri/10)%10; if(front==back){ a+=tri/10;//後一個數字加1 tri/=10; a/=tri;//後面的數字先以0填充 a*=tri; if(front!=a/(tri*10)%10)return GetMin2(a);//產生進位,須要從新檢驗前面的值 } tri/=10; } return a; } void main(){ cout<<GetMin2(989899)<<endl; cout<<GetMin(989898); system("pause"); }