给定任意一个正整数,求比这个数大且最小的“不重复数”,“不重复数”的含义是相邻两位不相同,例如:1101是重复数,1231是不重复数
思路:
1、前把这个正整数加1,保证求得的数比这个数大
2、从左到右开始遍历加1后的正整数,如果前一个数字与后一个数字相同,则后一个数字需要加1
3、如果后一个数字为9的话,加1会进位,这时可能会引起前面已检测过的值产生重复,此时,需要重新遍历
4、加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"); }