如果一個數字十進制表達時,不存在連續兩位數字相等,則稱之爲“不重複數”。例如,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); //打印用時
}
其實,這兩種方法大同小異吧: