给定任意一个正整数,求比这个数大且最小的“不重复数”,“不重复数”的含义是相邻两位不相同,例如: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"); }