通过平方的指数(获得乘法的数量)

时间:2013-02-17 10:05:16

标签: java math

我正在做作业,我必须使用exponentiation by squaring做两件事。一个是获得乘法的数量,另一个是获得实际结果。

以下是一些例子:

2
11

应输出

2048
5

因为2^11 = 2(2((2)²)²)²

我这样做没有递归,我得到了正确的结果,但乘法次数是错误的。如果我输入2^6我正在进行3次乘法,那就没问题但是如果我输入2^8我会得到4次乘法,这是错误的。

你能指出我在进行正确的乘法运算时遇到的错误吗?

以下是代码:

public static void main(String[] args) {
    double x, result = 1;
    int n, multiplications = 0;
    DecimalFormat df = new DecimalFormat("#.00");
    Scanner readLine = new Scanner(System.in);

    x = readLine.nextDouble();
    n = readLine.nextInt();

    if (n == 1) {
        multiplications++;
        System.out.print(df.format(x) + "\n" + multiplications + "\n");
    } else if (n == 2) {
        x *= x;
        multiplications++;
        System.out.print(df.format(x) + "\n" + multiplications + "\n");
    } else {
        while (n > 0) {
            if (n % 2 == 0) {
                multiplications++;
            } else {
                multiplications++;
                result *= x;
                n--;
            }
            x *= x;
            n /= 2;
        }
        System.out.print(df.format(result) + "\n" + multiplications + "\n");
    }
}

2 个答案:

答案 0 :(得分:1)

如果n % 2 == 0,则不会成倍增加;你只是方格。所以离开multiplications++

然后2 ^ 8你得到:

n  |  n % 2  |  multiplications
----------------------
8  |  0      |  0
4  |  0      |  0
2  |  0      |  0
1  |  1      |  1

1乘法应该是正确的。自2^8 = (((1² * 2)²)²)²

以来

如果你想将平方数作为乘法计数,你应该

... else
    multiplications = multiplications + 2

然后在初始平方和乘法中减去2。

总的来说:

while (n > 0) {       
    if(n % 2 == 1) {
        multiplications++;
        result *= x;
        n--;
    }
    multiplications++;
    x *= x; // shouldn't that be result *= result?
    n /= 2;
}
multiplications -= 2;

答案 1 :(得分:1)

您应该注意的是数字的二进制表示。 11的二进制表示是1011.从左到右阅读。对于每个新的二进制数字,将结果平方。然后对于每个1,也乘以因子。

对于2 ^ 11你做:

第一个数字是1,所以2。

下一个是零,所以只有2. 4。

下一个是一个,所以将4平方并乘以2. 4平方为16.时间2为32。

下一个是一个,所以正方形和乘法。 32平方是1024.第二次是2048。