题目:
给一个定义:对一个整数,若其中存在相邻两位上的数字相同,则称其为“重复的数”;现给定一个正整数n,求不小于n的最小的非“重复的数”。
思路:
假设输入的数为n,则令m=n,
分别取m的最低两位数字a,b,
判断是否a==b,如果是说明是重复的数,那么递归调用n=m+1;考虑特殊情况,ab=99,产生进位后100仍未重复数,此时应该递归调用n=m+2;
如果a!=b,则往前挪一位,即m=m/10,直至m/10=0为止,最后返回n。
该思路也可以通过非递归来实现,详见代码。
代码:
#include <iostream>
using namespace std;
int calNonRepetitionNum(int n){
if(n<10)
return n+1;
int a,b;
int base=1;
int m=n;
while(m/10)
{
b=m%10;
a=m/10%10;
base*=10;
if(a==b)
{
if(a==9)
return calNonRepetitionNum((m+2)*base/10);
else
return calNonRepetitionNum((m+1)*base/10);
}
m/=10;
}
return n;
}
int calNonRepetitionNum_2(int n){
if(n<10)
return n+1;
int a,b,m;
int base;
bool flag=true;
while(flag){
flag=false;
m=n;
base=1;
while(m/10){
a=m%10;
b=m/10%10;
base*=10;
if(a==b){
if(a==9){
n=(m+2)*base/10;
flag=true;
break;
}
else{
n=(m+1)*base/10;
flag=true;
break;
}
}
m=m/10;
}
}
return n;
}
int main()
{
cout << calNonRepetitionNum(99) << endl;
cout << calNonRepetitionNum_2(88) << endl;
return 0;
}