C++ 为什么这个递归算法在输入2147483647上给出了错误的答案?
我正在研究以下问题: 给定一个正整数n,您可以执行以下操作: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/2
- 如果n是奇数,可以用n+1或n-1替换n
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)
它计算相同的值,但没有溢出