如果一个数字十进制表达时,不存在连续两位数字相等,则称之为“不重复数”。例如,105,1234和12121都是“不重复数”,而11,100和1225不算。给定一个long类型数字A,返回大于A的最小“不重复数”。
Class: UnrepeatingNumbers
Method: next
Parameters: long
Returns: long
Method signature: long next(long A)
(be sure your method is public)
A 取值范围是[0, 10^17],注意是闭区间。
returns: 56
大于54的最小数字是55,但55不是“不重复数”。下一个数字是56,它满足条件。
1) 10
returns: 12
2) 9
returns: 10
3) 98
returns: 101
99和100都不是“不重复数”, 101是。
4) 21099
returns: 21201
#include<time.h>
long next(long n) //我的方法
{
int i=10;
long m,a,b;
n++;
m=n;
while(n>9)
{
a=n%10; //低位
b=n/10%10;//高位
if(a==b)
{
m++;
n=m;
i=10;
continue;
}
n/=i;
}
return m;
}
long getNext( long A) //官方的方法
{
A++;
bool done = true;
do {
long d = 1;//每次循环都让d=1
while (d*10 < A) //因一开始d=1,若一开始A就比10还小,说明比较到达了最高位,则不执行次循环
d*=10; // 直到A比d大
done = true;
while (d > 1) { //只要d是大于1的,说明上面已经执行过循环,也就说明未比较到最高位
long nd = d / 10;
if ( (A / d) % 10 == (A / nd) % 10 ) { //高位与低位的比较
A/= nd; //用以低位加1
A++; //低位加1
A*= nd; //再乘回来
done = false;
}
d = nd; //表明d和nd都增大10倍
}
}
while (! done);
return A;
}
int main()
{
clock_t start,finish;
double totaltime;
long a,b;
scanf("%ld",&a);
//b=next(a);
b=getNext(a);
printf("returns: %ld/n",b);
finish=clock(); //结束计时
totaltime=(double)(finish-start)/CLOCKS_PER_SEC;
printf("%lf/n",totaltime); //打印用时
}
其实,这两种方法大同小异吧: