实施pow(x,n)

时间:2015-06-15 05:30:20

标签: c++ algorithm math

为什么此功能在我尝试时会给出错误的答案-1而不是正确的答案1myPow(-1.00000, -2147483648)

double QuickPower(double x, int n) 
{
    if(n==0){
        return 1;
    }

    if(n==1){
        return x;
    }

    if(n>=2){
        int res=n%2;
        double half=QuickPower(x,n/2);
        return res? Half*half*x: half*half;
    }
}

double myPow(double x, int n) {
    return n>=0? QuickPower(x,n):(1/QuickPower(x,-n));
}

我只是尝试运行下面的代码。打印出“Hello World”。 这里我没有指定数据类型,但它仍然传递if语句。为什么呢?
if (-1 > 2147483648) { cout << "Hello World"; }

5 个答案:

答案 0 :(得分:5)

错误是整数溢出的结果。

myPow内,当n为负数时,你否定n。

否定-2147483648给出2147483648,这比最大正有符号32位整数值(2147483647)多1。使用更大的整数数据类型来修复错误。

答案 1 :(得分:3)

请注意Primitive data type ranges是:

short int and int: −32,768 to 32,767 

unsigned short int and unsigned int: 0 to 65,535 

long int: −2,147,483,648 to 2,147,483,647 

unsigned long int: 0 to 4,294,967,295 

long long int: −9,223,372,036,854,775,808 to 9,223,372,036,854,775,807

参考: MSDNThe GNU C Reference

如您所见,整数可以容纳的最小值为−2,147,483,648,因此当您执行-(−2,147,483,648)时会发生整数溢出。

因此,请使用long long int代替int来处理大号签名。

以下代码:

#include <vector>
#include <string>
#include <iostream>
using namespace std;

double QuickPower(double x, long long int n)
{
    if(n==0){
        return 1;
    }

    if(n==1){
        return x;
    }

    if(n>=2){
        long long int res=n%2;
        double half=QuickPower(x,n/2);
        return res? half*half*x: half*half;
    }
    else
        return 0;
}

double myPow(double x, long long int n) {
    return n>=0? QuickPower(x,n):(1/QuickPower(x,-n));
}

int main () {
    cout << myPow(-1.00000, -2147483648);
}

给我输出:

  

1

答案 2 :(得分:3)

您的问题是由于计算-n时整数溢出造成的。 在您的系统(和我的本地系统)上INT_MIN = - 2147483648和INT_MAX = 2147483647。

所以问题是-(INT_MIN)不能表示为整数。 但是,如果不使用更高精度的整数类型,则可以避免此问题:

x n = x n + 1 / x =(1 / x)/ x - (n + 1)

我们可以将myPow重写为

double myPow(double x, int n) {
    return n>=0? QuickPower(x,n):(1/x)/QuickPower(x,-(n+1));
}

此功能正常,因为-(INT_MIN+1)=INT_MAX

值得注意的是,这将myPow(0,-k)返回+/-无穷大(n = -1)或NaN(n <-1)。如果你需要那个案例那么一致 需要做更多的工作。一般来说,无限/纳米值的处理对于pow来说是棘手的(而不是&#34;正确&#34;在这个或原始实现中) - man page for the C pow function值得所有边缘情况。< / p>

答案 3 :(得分:0)

/*Java Solution */

class Solution {

public double myPow(double x, int n) {

if(n == 0) return 1;

if(Math.abs(x-0.0)<0.0000001) return 0.0;

if(Math.abs(x-1.0)<0.0000001) return 1.0;

if(n < 0) x = 1.0/x;

return Power(x, Math.abs(n));

}

double Power(double x, int n){

if(n == 0) return 1;

if(n == 1) return x;

return ((n&0x1) == 1) ? x*Power(x*x, n/2) : Power(x*x, n/2); 
}

}

答案 4 :(得分:0)

C# 简单的解决方案:

df2.groupBy("production_companies_values").count().show()

运行此代码后,变量“result”的值将等于 1