为什么此功能在我尝试时会给出错误的答案-1
而不是正确的答案1
? myPow(-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";
}
答案 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
如您所见,整数可以容纳的最小值为−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