突然发现,有道难题也有编程比赛,先看了一下去年的题目,自己写了一个方法,再与官方给出的方法相比较,下面我对我的方法和官方方法作一下比较,找出不足,进步进步
。首先列出题目:
Problem Statement:
如果一个数字十进制表达时,不存在连续两位数字相等,则称之为“不重复数”。例如,105,1234和12121都是“不重复数”,而11,100和1225不算。给定一个long类型数字A,返回大于A的最小“不重复数”。
Definition:
Class: UnrepeatingNumbers
Method: next
Parameters: long
Returns: long
Method signature: long next(long A)
(be sure your method is public)
Constraints:
A 取值范围是[0, 10^17],注意是闭区间。
Examples:
0) 54
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
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<stdio.h>
#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;
}
#include<time.h>
long next(long n) //我的方法
{
}
long getNext( long A)
{
}
int main()
{
}
相同点:
主要是对输入值进行处理,不断除10取整,比较,直到比较到最高位为止;
不同点:
我的方法:另外声明一个long,对原来的值进行保存,而原来的值,则不断的进行除10取整;
官方的方法:声明了一个bool变量,用来判断是否进行到了最高位;而原来的值,则不断的移位比较而已,通过除10,100,1000...依次比较下去,而bool就用来控制除数的尽头。