“不重复数”问题

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/davidsher_zhou/article/details/69056042

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年武大复试上机

猜你喜欢

转载自blog.csdn.net/davidsher_zhou/article/details/69056042
今日推荐