bool isPerfectSquare(int num) {
if(num<2) return true;
if(num==2) return false;
int mid=0;
int j= min(num, 46341);
for(int i=1;i<=j;){
mid=(i+j)/2;
if(mid*mid==num) return true;
else if(mid*mid<num) i=mid+1;
else j=mid-1;
}
return false;
}
这是一个开平方的函数。红色这一条指令是必加的。
因为 我的解题思路是用二分的方式来寻找。
为什么加?
sqrt(int_max) =46430.95
因为int_max 的开平方小于46431,所以我们可以直接从(1,46431)之中找num的开平值。
如果不加会怎么样?
如果第一个二分值mid=(1+num)/2 大于46341 的话,mid*mid 会发生溢出变成负数。从而产生错误。
**因为mid*mid产生的是一个临时变量,是否发生溢出跟mid 自身的变量类型有关,上面是int类型 32位 会发生溢出。
下面是对各种类型的测试。 立即数是跟32位有关,这个是跟编译器有关。
而有变量类型的产生的临时变量还是原本的临时变量。
int64_t t1=46431;
cout<<"int_64 "<< t1*t1<<endl;
int32_t t2=46431;
cout<<"int_32 " <<t2*t2<<endl;
double t3=46431;
cout<<"double "<< t3*t3<<endl;
cout<<"无类型 " <<46431*46431<<endl;
本文探讨了在实现求开平方函数时可能遇到的溢出问题,通过示例代码解释了如何避免溢出错误。核心在于限制二分搜索范围,以防止中间结果超过int类型的最大值导致负数溢出。同时还测试了不同数据类型在乘法运算时的溢出行为。
980

被折叠的 条评论
为什么被折叠?



