fengqingdan 2022-01-04 21:59 采纳率: 0%
浏览 83

(long)(middle * middle) 与(long)middle * middle有什么

leetcode 367题:给定一个 正整数 num ,编写一个函数,如果 num 是一个完全平方数,则返回 true ,否则返回 false 。
遇到了如下问题:(long)(middle * middle)就会报越界,而(long)middle * middle就不会,求帮忙解答,不胜感激!!代码如下:
class Solution {
public:
    bool isPerfectSquare(int num) {
        
        if(num == 1)
        {
            return true;
        }

        int left = 0;
        int right = num;
        while(left <= right)
        {
            int middle = left + (right - left) / 2;
            if((long long)(middle * middle) < num)
            {
                left = middle + 1;
            }
            else if((long long)middle * middle > num)
            {
                right = middle - 1;
            }
            else
            {
                return true;
            }

        }
        return false;

    }
};
运行结果及报错内容
执行出错信息:

Line 15: Char 35: runtime error: signed integer overflow: 1000052909 * 1000052909 cannot be represented in type 'int' (solution.cpp)
SUMMARY: UndefinedBehaviorSanitizer: undefined-behavior prog_joined.cpp:24:35

最后执行的输入:

2000105819

  • 写回答

3条回答 默认 最新

  • 关注

    middle 是int类型
    (long long)(middle * middle)是先计算middle * middle结果还是int类型,如果这时结果超出int类型范围就直接变成负数.之后再转为long long类型也是没用的
    而(long long)middle * middle是先把前面的middle转成long long类型,再与后面的middle相乘结果就是long long类型. 也就不会因为超出int类型范围而变成负数了

    如有帮助,请点击我的回答下方的【采纳该答案】按钮帮忙采纳下,谢谢!

    img

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 1月4日

悬赏问题

  • ¥60 版本过低apk如何修改可以兼容新的安卓系统
  • ¥25 由IPR导致的DRIVER_POWER_STATE_FAILURE蓝屏
  • ¥50 有数据,怎么建立模型求影响全要素生产率的因素
  • ¥50 有数据,怎么用matlab求全要素生产率
  • ¥15 TI的insta-spin例程
  • ¥15 完成下列问题完成下列问题
  • ¥15 C#算法问题, 不知道怎么处理这个数据的转换
  • ¥15 YoloV5 第三方库的版本对照问题
  • ¥15 请完成下列相关问题!
  • ¥15 drone 推送镜像时候 purge: true 推送完毕后没有删除对应的镜像,手动拷贝到服务器执行结果正确在样才能让指令自动执行成功删除对应镜像,如何解决?