int Power(double x, double y) {
long long power = y;
double result = 1.0;
if (y<0) {
power = -power;
x = 1 / x;
}
while (power) {
if (power & 1) {
result *= x;
}
x *= x;
power >>= 1;
}
std::cout << result;
return result;
}
我正在寻求有关此代码的澄清。以下是我对代码的几个问题
- 当幂为负时,它在哪里乘以 1/(x*y)?
- 在 while 循环内的 if 语句中,它测试以查看 power%2 == 0,但如果它不是 mod 2,那么该计算在哪里进行?
- 如果有人可以通过像 x = 2 和 y = 4 这样的示例来澄清,并展示程序如何运行以计算 16 的幂,那将非常有帮助。
我是编程新手,因此试图通过这些示例来理解基本的基元类型。提前谢谢你。
- 当幂为负时,它在哪里乘以 1/(x*y)?
无处。当y
为负数时,代码使用power = -power; x = 1 / x;
。
- 在 while 循环内的 if 语句中,它测试以查看 power%2 == 0,但如果它不是 mod 2,那么该计算在哪里进行?
不,它没有。该代码不检查功率是否均匀。它确实检查功率是否为奇数:
if (power & 1) {
result *= x;
}
现在剩下的是偶数,如果你考虑到这个(x^2n) == (x^n)^2
那么你就会明白为什么代码继续:
x *= x;
power >>= 1;
例如,power
5
,则奇数幂由result*=x;
处理,我们还剩下 4 个,x^4
与(x^2)^2
相同,因此我们可以将循环与power
除以2
并x
替换为x^2
。
- 如果有人可以通过 x = 2 和 y = 4 之类的例子来澄清,并展示程序如何运行以计算 16 的幂,那将非常有帮助。
您应该借此机会学习如何使用调试器。如果要单步执行代码以查看每行的作用:调试器。
PS:代码几乎是"OK-ish"。根本不行的是关于类型的混乱。double y
分配给long long power
,double result
作为int
返回。这一切都没有意义。该函数未正确计算浮点幂。由于这只是一个练习,我建议在任何地方都使用int
,现在专注于整数。最后但并非最不重要的一点是,请注意,这是实际上不应该编写的代码,因为有人已经这样做了:std::pow
。