c++ - 我执行幂函数有什么问题?

标签 c++ algorithm

我在 leetcode 中为一个简单的问题写了一段代码。它要求执行 pow(x,n);它告诉我“运行时错误”,最后执行的输入:1.00000,-2147483648。我换了另一种方法,行得通。但我只想知道我在下面的代码中做错了什么。非常感谢!!

class Solution {
public:
    double pow(double x, int n) {
        // IMPORTANT: Please reset any member data you declared, as
        // the same Solution instance will be reused for each test case.
        if(n==0 && x==0) return 1.0;
        if(x==0) return 0;
        if(n==0) return 1.0;
        if(n<0) return 1/pow(x,-n);
        if(n==1) return x;

        double y=pow(x,n/2);
        if(n%2==1) return y*y*x;
        else return y*y;

}

};

最佳答案

假设int长度为 32 位,-2147483648是除 0 之外的唯一值,其中它的否定等于自身。所以行:

if(n<0) return 1/pow(x,-n);

使用相同的参数调用自身,并一直这样做直到出现堆栈溢出。

更详细地说,-2147483648 的二进制表示是:

10000000000000000000000000000000

那是 1其次是 31 0秒。根据two's complement取反是一个两步过程。 1)全部改0 s 至 1反之亦然:

01111111111111111111111111111111

然后 2) 添加 1:

10000000000000000000000000000000

所以我们得到相同的值。因此无限递归。

如果您必须处理这种情况,这里有一个想法。将其插入到 n<0 之前测试:

if (n==-2147483648) return 1/(x*pow(x,2147483647));

显然这是针对这个案例的黑客攻击。最终,您的问题域将决定最优雅/最通用的解决方案。

关于c++ - 我执行幂函数有什么问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20155861/

相关文章:

c++ - 无法使用 QProcess 运行简单的控制台程序

c++ - 使用 par_unseq 时,我仍然可以依赖输出元素的顺序吗?

c++ - Windows C++中线程的退出代码

python - 查找近似重复项查询

algorithm - 如何计算 for (int i = n - 1; i != 0; i/= 2) 的时间复杂度?

javascript - 查找数组中出现频率最高的项目(不仅仅是字符串)

c++ - 查找 MST 的关键边缘 : possible with modified Prim's algorithm?

c++ - 如何从Visual C++中获取具体的windows服务可执行文件路径

Ruby 解析输入文件并放入哈希

c++ - 如何在 makefile 指令中包含 C 和 C++ 文件