1、给定任意一个正整数,求比这个数大且最小的“不重复数”,“不重复数”的含义是相邻两位不相同,例如1101是重复数,而1201是不重复数。(15分)
//解题思路,从最高位开始遍历此整数,将最先遇到的相同相邻数做处理,后面直接变为010101....一下分为四种情况:如1223344则变为123010101;当遇到9时要进位,如199223344变为201010101;当9在最高位,如99223344则要向最高位进一位变为101010101;当没有相邻位的情况,则加1输出,如12345则要变为12346.
#include<stdio.h>
#include<stdlib.h>
int convert(char *a,int n);
void getnum(char *a,int count);
#define N 20
int
main (int argc, char *argv[])
{
int n=19998989,count,i;//count用于计算数据长度
char a[N];
for(i=0;i<N;i++)
a[i]='0'; //先将数组全置‘0’
count=convert(a,n);//将整数存入数组中
if (a[N-count]=='9')//设置输出数的个数
i=N-count -1;
else i=N-count;
getnum(a,count);
for(;i<=N;i++)
printf("%c",a[i]);
putchar('\n');
return 0;
}
void getnum(char a[N],int count)
{
char *p1=a+N-count,*p2=NULL,*p3=NULL;
int flag=0,sign=0;
count--;
while(--count)
{
p2=p1+1;
if (flag==1)//遇到相同相邻位则将后面的全置为010101....
{
if(sign%2)
*p3='1';
else *p3='0';
putchar(*p3);
putchar('\n');
p3++;
sign++;
}
if((*p1)==(*p2)&&(*p2)!='9'&&flag==0)//相邻位为非9的情况
{
(*p2)++;
flag=1;
p3=p2+1;
count+=1;
}
if((*p1)==(*p2)&&(*p2)=='9'&&flag==0)//相邻位为9的情况
{
p2-=2;
(*p2)++;
putchar(*p2);
putchar('\n');
flag=1;
p3=p2+1;
count+=3;
}
p1++;
}
if(flag!=1) (*++p2)++;//没有遇到相邻位相同的情况
}
int convert(char *a,int n)
{
char *p=a+N-1;
int count=0;
while(n)
{
*p=n%10+'0';
n/=10;
p--;
count++;
}
return count;
}