首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

求算法:给定一个long部类数字A,返回大于A的最小“不重复数”

2013-01-01 
求算法:给定一个long类型数字A,返回大于A的最小“不重复数”果一个数字十进制表达时,不存在连续两位数字相等

求算法:给定一个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;
}


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

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

热点排行