歌笑爱学习 2022-01-04 21:59 采纳率: 0%
浏览 108

(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日