我正在做作业,我必须使用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");
}
}
答案 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。