Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么这个递归算法在输入2147483647上给出了错误的答案?_C++_Algorithm_Recursion - Fatal编程技术网

C++ 为什么这个递归算法在输入2147483647上给出了错误的答案?

C++ 为什么这个递归算法在输入2147483647上给出了错误的答案?,c++,algorithm,recursion,C++,Algorithm,Recursion,我正在研究以下问题: 给定一个正整数n,您可以执行以下操作: 如果n为偶数,则将n替换为n/2 如果n是奇数,可以用n+1或n-1替换n n变为1所需的最小替换次数是多少 下面是我想出的代码: class Solution { private: unordered_map<int, long long> count_num; public: int integerReplacement(int n) { count_num[1] = 0;count

我正在研究以下问题:

给定一个正整数n,您可以执行以下操作:

  • 如果n为偶数,则将n替换为n/2
  • 如果n是奇数,可以用n+1或n-1替换n
n变为1所需的最小替换次数是多少

下面是我想出的代码:

class Solution {
private:
    unordered_map<int, long long> count_num;
public:
    int integerReplacement(int n) {
        count_num[1] = 0;count_num[2] = 1;count_num[3] = 2;
        if(!count_num.count(n)){
            if(n%2){
                count_num[n] = min( integerReplacement((n-1)/2), integerReplacement((n+1)/2) )+2;
            }else{
                count_num[n] = integerReplacement(n/2) +1;
            }
        }
        return(count_num[n]);
    }
};
类解决方案{
私人:
无序映射计数;
公众:
整数置换(整数n){
计数数值[1]=0;计数数值[2]=1;计数数值[3]=2;
如果(!count_num.count(n)){
如果(n%2){
count_num[n]=min(整数置换((n-1)/2),整数置换((n+1)/2))+2;
}否则{
count_num[n]=整数置换(n/2)+1;
}
}
返回(count_num[n]);
}
};

当输入为2147483647时,我的代码错误地输出33而不是正确答案32。为什么我的代码在这里给出了错误的答案?

我怀疑这是整数溢出。您列出的数字(2147483647)是可以容纳在
int
中的最大可能值,假设您使用的是带符号的32位整数,因此如果向其中添加一个,则溢出到
int\u MIN
,即−2,147,483,648. 因此,您会得到错误的答案也就不足为奇了,因为这个值不是您期望得到的值

溢出特别发生在您计算时

integerReplacement((n+1)/2)
因此,您需要修正这种情况,以计算(n+1)/2而不会溢出。这是一个非常极端的边缘情况,所以我并不奇怪代码会在它上面出错

一种方法是注意,如果n是奇数,那么(n+1)/2等于(n/2)+1(带整数除法)。所以也许你可以把它改写成

integerReplacement((n / 2) + 1)
它计算相同的值,但没有溢出