为了账号安全,请及时绑定邮箱和手机立即绑定

我只是增加了反转数字的复杂性吗?

我只是增加了反转数字的复杂性吗?

翻翻过去那场雪 2021-07-11 16:23:38
public class HelloWorld{ public static void main(String []args){    int  orig=103, reverse=0, mod;    int numOfDigits=0;    int n = orig;    while (n>0){        n /= 10;        numOfDigits++;    }    n = orig;    while (n > 0){        mod = n % 10;        reverse = reverse + (int)(mod * java.lang.Math.pow(10, numOfDigits-1));        numOfDigits--;        n /= 10;    }System.out.println("Reversed is : " + reverse); }}我知道reverse = reverse + (int)(mod * java.lang.Math.pow(10, numOfDigits-1));可以用reverse = mod + (reverse*10).想知道我是否只是通过计算总位数和应用功率来增加简单程序的复杂性?PS:请假设 orig 可以作为用户的输入,并且可以是任意数量的数字。我只为实验进行了硬编码。
查看完整描述

3 回答

?
红糖糍粑

TA贡献1815条经验 获得超6个赞

你没有增加复杂性……但你确实让它变慢了。表达式 pow(10, numOfDigits - 1)将大大慢于reverse = mod + (reverse * 10)

Math.pow由于浮点不精确,使用代替整数乘法的计算也可能不准确。Adouble的精度只有 52 位,而 a 的精度为 63 位long。在这个例子中,这可能不适用,但一般来说这是需要警惕的


查看完整回答
反对 回复 2021-07-14
?
ABOUTYOU

TA贡献1812条经验 获得超5个赞

可能,这将是具有较少迭代和复杂性的最佳方法:


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));

}

}


查看完整回答
反对 回复 2021-07-14
?
德玛西亚99

TA贡献1770条经验 获得超3个赞

计算乘法次数和加法次数:
假设 f(x) = an * x^n + an-1 * x^n-1 + ... + a1 * x + a0
1. 如果通过计算 1 来计算 f(x)一项一项,
它将需要 (n+1) + n + (n-1) + ... + 1 + 0 = (n+1)(n+2)/2 次乘法和 n 次加法。
2. 如果通过 计算 f(x) n = n*10 + mod
则需要 n 次乘法和 n 次加法。

当然,如果pow()有一些优化,比如“分而治之”,复杂度pow()应该是O(logN)。


查看完整回答
反对 回复 2021-07-14
  • 3 回答
  • 0 关注
  • 113 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信