“不重复数”问题

来源:互联网 发布:淘宝自我介绍72字范本 编辑:程序博客网 时间:2024/05/21 19:46

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

1 0
原创粉丝点击