reverse = reverse + (int)(mod * java.lang.Math.pow(10, numOfDigits-1));
}
我确实知道reverse = mod + (reverse*10)
可以替换为{{1}}。
想知道我是否只是通过计算数字总数并施加幂来增加简单程序的复杂性?
P.S:请假定orig可以作为用户的输入,并且可以是任意数量的数字。我仅对实验进行了硬编码。
答案 0 :(得分:5)
您没有增加复杂性...但是您确实使它变慢了。表达式pow(10, numOfDigits - 1)
会比reverse = mod + (reverse * 10)
由于浮点数的不精确性,使用Math.pow
而不是整数乘法的计算也可能不准确。 double
的精度仅为52位,而long
的精度为63位。在此示例中,这可能并不适用,但是通常要警惕
答案 1 :(得分:1)
这可能是最好的方法,它具有更少的迭代次数和复杂度:
public class NumReverse {
public long reverseNumber(long number){
long reverse = 0;
while(number != 0){
reverse = (reverse*10)+(number%10);
number = number/10;
}
return reverse;
}
public static void main(String a[]){
System.out.println("Reversed is: "+new NumReverse().reverseNumber(103));
}
}
答案 2 :(得分:0)
计算相乘时间和相加时间:
假设f(x)= an * x ^ n + an-1 * x ^ n-1 + ... + a1 * x + a0
1.如果通过逐项计算一项来计算f(x),
它将需要(n + 1)+ n +(n-1)+ ... + 1 + 0 =(n + 1)(n + 2)/ 2乘积和n次加法。
2.如果用n = n*10 + mod
计算f(x),
这将需要n次乘法和n次加法。
当然,如果pow()
进行了一些优化(例如“分而治之”),则pow()
的复杂度应为O(logN)。