读书人

求算法:给定一个long类型数字A返回

发布时间: 2012-05-15 14:35:29 作者: rapoo

求算法:给定一个long类型数字A,返回大于A的最小“不重复数”
果一个数字十进制表达时,不存在连续两位数字相等,则称之为“不重复数”。例如,105,1234和12121都是“不重复数”。给定一个long类型数字A,返回大于A的最小“不重复数”。


要求就是这么个样子,目前我做的是获取第位数字,然后把0-9 这10个数字出现次数进行统计,如果>2就说明是重复数,同时获取重复的是第几位数,把原来的【数字+(重复的数+1)*(10^位数)】,这样就能够进行一次把重复的数字去掉。但是这个需要做重复判断,我怎么都搞不定

不知道谁还有更好的算法没有,有好的思路或者算法贴上来给小弟参考参考。。。。

C/C++ code
#include<iostream.h>int tab[]={0,0,0,0,0,0,0,0,0,0};        //存储10个数字每个数字出现次数的表int wei=0,shu=0;        //wei存储第几位开始重复,shu存储重复的数字是什么int signal;void comp(int temp[],int i);        //审明比较函数,用于比较是否有重复数字void plus(int a,int wei,int shu);        //加法函数,使重复数变为不重复数void main(){    long a,i;        //a存储输入的值,i存储数字位数    int temp[32];        //数组b存储相应位的数字                i=0;    cin>>a;        //对输入进行处理,把每位数字取出,并依次存储在temp[]数组中    while(a)    {        temp[i]=a%10;        a/=10;        i++;    }    //输出每个位的数字     for(int j=i;j>0;j--)    {        cout<<"temp["<<j<<"] = "<<temp[j-1]<<endl;    }    comp(temp,i);        //进行比较判断,是否有重复数    if(shu)    {        cout<<"没有重复数字!"<<endl;    }    plus(a,wei,shu);    cout<<"plus!"<<endl;            //输出每个数字出现次数            for(int k=0;k<10;k++)    {        cout<<"tab["<<k<<"] = "<<tab[k]<<endl;    }}//比较函数,判断是否有重复数字,void comp(int temp[],int i){    int lengh=i+1;        //数字总位数+1,计算第n位重复的转换量            for(;i>0;i--)        //每个位数进行判断是什么数,找到相应的数在tab表里加1    {        //数字出现则在相应的tab表里+1        switch(temp[i-1])        {            case 0 :                    tab[0]++;                if(tab[0]>1)                {                     cout<<"第"<<lengh-i<<"位重复!"<<endl;                    signal++;                    wei=lengh-i;                }                     break;            case 1 :                    tab[1]++;                if(tab[1]>1)                 {                    cout<<"第"<<lengh-i<<"位重复!"<<endl;                    signal++;                    wei=lengh-i;                }                     break;            case 2 :                    tab[2]++;                if(tab[2]>1)                 {                    cout<<"第"<<lengh-i<<"位重复!"<<endl;                    signal++;                    wei=lengh-i;                }                     break;            case 3 :                    tab[3]++;                if(tab[3]>1)                 {                    cout<<"第"<<lengh-i<<"位重复!"<<endl;                    signal++;                    wei=lengh-i;                }                     break;            case 4 :                    tab[4]++;                if(tab[4]>1)                 {                    cout<<"第"<<lengh-i<<"位重复!"<<endl;                    signal++;                    wei=lengh-i;                }                     break;                    case 5 :                    tab[5]++;                if(tab[5]>1)                 {                    cout<<"第"<<lengh-i<<"位重复!"<<endl;                    signal++;                    wei=lengh-i;                }                     break;            case 6 :                    tab[6]++;                {if(tab[6]>1)                 {                    cout<<"第"<<lengh-i<<"位重复!"<<endl;                    signal++;                    wei=lengh-i;                }                     break;            case 7 :                    tab[7]++;                if(tab[7]>1)                {                    cout<<"第"<<lengh-i<<"位重复!"<<endl;                    signal++;                    wei=lengh-i;                }                     break;            case 8 :                    tab[8]++;                if(tab[8]>1)                 {                    cout<<"第"<<lengh-i<<"位重复!"<<endl;                    signal++;                    wei=lengh-i;                }                     break;            case 9 :                    tab[9]++;                if(tab[9]>1)                {                    cout<<"第"<<lengh-i<<"位重复!"<<endl;                    signal++;                    wei=lengh-i;                }                     break;            default :                cout<<"error!"<<endl;                break;        }    }    //判断是否有重复数字    for(int n=0;n<10;n++)        {            if(tab[n]>1)            {                cout<<"数字"<<n<<"重复!"<<endl;                                    }                }    }}//加法函数void plus(int a,int wei,int shu){    int num_plus=shu*(10^wei);    a=a+num_plus;    cout<<"最小的不重复数为:"<<a<<endl;} 



[解决办法]
循环从低位向高位检查重复,如果第[k+1,k]位重复,则加10^k
然后从k-1位开始向高位检查,直至最高位

如果[k,k-1]又重复了,那么加10^(k-1)后,就从k-2位开始

读书人网 >C++

热点推荐