求算法:给定一个long类型数字A,返回大于A的最小“不重复数”
果一个数字十进制表达时,不存在连续两位数字相等,则称之为“不重复数”。例如,105,1234和12121都是“不重复数”。给定一个long类型数字A,返回大于A的最小“不重复数”。
要求就是这么个样子,目前我做的是获取第位数字,然后把0-9 这10个数字出现次数进行统计,如果>2就说明是重复数,同时获取重复的是第几位数,把原来的【数字+(重复的数+1)*(10^位数)】,这样就能够进行一次把重复的数字去掉。但是这个需要做重复判断,我怎么都搞不定
不知道谁还有更好的算法没有,有好的思路或者算法贴上来给小弟参考参考。。。。
#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;}