计算能力(x,y)代码澄清C++

  • 本文关键字:代码 C++ 能力 计算 c++
  • 更新时间 :
  • 英文 :

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. 当幂为负时,它在哪里乘以 1/(x*y)?
  2. 在 while 循环内的 if 语句中,它测试以查看 power%2 == 0,但如果它不是 mod 2,那么该计算在哪里进行?
  3. 如果有人可以通过像 x = 2 和 y = 4 这样的示例来澄清,并展示程序如何运行以计算 16 的幂,那将非常有帮助。

我是编程新手,因此试图通过这些示例来理解基本的基元类型。提前谢谢你。

  1. 当幂为负时,它在哪里乘以 1/(x*y)?

无处。当y为负数时,代码使用power = -power; x = 1 / x;

  1. 在 while 循环内的 if 语句中,它测试以查看 power%2 == 0,但如果它不是 mod 2,那么该计算在哪里进行?

不,它没有。该代码不检查功率是否均匀。它确实检查功率是否为奇数:

if (power & 1) {
result *= x;
}

现在剩下的是偶数,如果你考虑到这个(x^2n) == (x^n)^2那么你就会明白为什么代码继续:

x *= x;
power >>= 1;

例如,power5,则奇数幂由result*=x;处理,我们还剩下 4 个,x^4(x^2)^2相同,因此我们可以将循环与power除以2x替换为x^2

  1. 如果有人可以通过 x = 2 和 y = 4 之类的例子来澄清,并展示程序如何运行以计算 16 的幂,那将非常有帮助。

您应该借此机会学习如何使用调试器。如果要单步执行代码以查看每行的作用:调试器。

PS:代码几乎是"OK-ish"。根本不行的是关于类型的混乱。double y分配给long long powerdouble result作为int返回。这一切都没有意义。该函数未正确计算浮点幂。由于这只是一个练习,我建议在任何地方都使用int,现在专注于整数。最后但并非最不重要的一点是,请注意,这是实际上不应该编写的代码,因为有人已经这样做了:std::pow

最新更新