1、如果一个数字十进制表达时,不存在连续两位相同,则称之为“不重复数”。例如,105、1234、12121都是不重复数,而11、100、1225不是。给定一个正整数A,返回大于A的最小不重复数。A小于100000.
示例:输入:value =21099 返回:21201
本题的难点不在于判断是否是不重复数,而在于输出大于A的最小不重复数。
特别考虑集中情况:1、99、999、9999等
2、199、299、399等
基本思想:通过递归循环判断是不是“不重复数”,若是,则相同的部分低位加1,再循环判断,最后输出大于A的最小不重复数;若不是,则直接输出。
void fun(int a[],int size){ //使用递归实现Q5调用的
int i,j,N=0,c=1; //c用在数组元素转换为整数位数,c分别为1,10,100,1000等。
int flag=0;
for(j=size-1;j>=0;j--){ //注意从高位到低位比较,若从低位开始则1000出现错误为1012非1010
if(a[j]==a[j-1]){
if(a[j-1]<9){ //排除含有199、299等情况
flag=1;
a[j-1]++;
fun(a,size);
}
else { //单独考虑199、299等情况
flag=1;
a[j-1]=0;
a[j]=a[j-1];
a[j+1]+=1;
fun(a,size);
}
}
}
if(flag==0){
i=0;
while(i<size){
N+=a[i++]*c;
c*=10;
}
printf("%d\n",N);
}
}
void Q5(){
int N,M; //N为输入整数、M为特殊情况下
while(scanf("%d",&N)!=EOF){
int a[10],b[10];
int size1=0,size2=0; //size1,size2分别为N、M位数
M=N+1; //判断是否为99、999、9999等类型
while(N){
a[size1++]=N%10;
N/=10;
}
while(M){
b[size2++]=M%10;
M/=10;
}
if(size1==size2){
fun(a,size1);
}
else fun(b,size2);
}
}
int main(){
//Q1(); //共吃了9天
//Q2(); //兔子生崽问题
//Q3(); //质数分解问题
//Q4(); //输出次数和顺序号
Q5(); //输出“不重复数”注意考虑周全
}
其他问题见下载资源我的2017年武大复试上机