我编写了一个获取给定数字的函数,并将其添加到反向,直到数字为回文。我试图计算代码的时间复杂度,但我根本不知道该怎么做,甚至不知道如何开始。有人能告诉我怎么做吗?另外,这是最有效的方法吗?或者将整数转换为字符串更好吗?
void getPali(int num) {
int n = 0;
int nNum;
while(true) {
nNum = num;
int rNum = 0;
while (nNum > 0) {
int rem = nNum % 10;
nNum = nNum / 10;
rNum = rNum * 10 + rem;
}
if(rNum == num) break;
num += rNum;
n++;
}
}
答案 0 :(得分:2)
数学中是否存在未解决的问题,是否在基数10中存在Lychrel numbers。Lychrel数是反向和向自身添加数字的重复过程无法产生回文的数字。
由于您的代码实现了此过程,因此无法确定代码的时间复杂度。
当然,这假设“int”是无界的,并不像在真正的java程序中那样环绕,但时间复杂性对于有界域无论如何都是没有意义的。
猜测起点196不会终止。
答案 1 :(得分:1)
好吧,作为输入值num的函数。这段代码:
while (nNum > 0) {
int rem = nNum % 10;
nNum = nNum / 10;
rNum = rNum * 10 + rem;
}
必须执行log(n)次。这是因为每次通过这个循环都会使nNum减少10倍。因此,对于数字2 ^ 10,循环需要10次迭代才能完成。此外,由于nNum在每个循环开始时被重置为n,因此每次循环时此循环将花费相同的时间。
然后循环的下一部分是
if(rNum == num) break;
num += rNum;
n++;
这实际上是循环条件,但它是以奇怪的方式编写的。较大的循环将执行,直到rNum = num。所以问题是rNum增加的速度有多快。答案是rNum每次通过大循环时增加10倍,因此要达到num,它将再次花费lg(n)时间。
因此,组合时间复杂度为log(n)^ 2。因为外循环执行log(n)次,内循环执行log(n)次。因此,时间复杂度是log(n)^ 2(或log ^ 2(n))