c++ 运行时错误:有符号整数溢出:-2147483648 * -1无法以型别'int'表示

yfjy0ee7  于 2022-11-19  发布在  其他
关注(0)|答案(2)|浏览(341)

下面的程序是为了检查一个数(比如“n”)的素因子是否只限于2、3和5。但是程序给我一个有符号整数溢出运行时错误。有人能帮助我解决这个问题吗?下面是代码:

bool check(int n)
   {
       if(n<0)
       n=n*(-1); // If 'n' is negative, making it positive.
       int count=1; //'count' variable to check whether the number is divisible by 2 or 3 or 5.
       while(n!=1 && count)
       {
           count=0;
           if(n%2==0)
           {
               n/=2; count++;
           }
           else if(n%3==0)
           {
               n/=3; count++;
           }
           else if(n%5==0)
           {
               n/=5; count++;
           }
       }
       if(n==1)
       return true;
       else return false;
       
    }

程序出现此错误:

运行时错误:有符号整数溢出:-2147483648 * -1无法以型别'int'表示

jgwigjjp

jgwigjjp1#

  • -2147483648 * -1无法以类型'int' [带负数号的32比特]表示 *

当然,它不能,你知道为什么吗?一个简单的事实的代表。
假设有4位而不是32位。您将有1位用于符号,3位用于 * 绝对值 *,对吗?
好吧,假设你在第一位有0代表正数,1代表负数。
那么你只能用绝对值来表示2^3 = 8的组合,对吗?你只有8个正数和8个负数。

BUT0被认为是正的,所以你有8个负的,7个正的和1个中性的。所以你有从-87的数字。

在本例中,您拥有从-21474836482147483647的数字。

xsuvu9jc

xsuvu9jc2#

如果你的素因子被限制为2、3或5,那么最简单的方法是:

if (n < 0) return false;

但是如果你的素因子也可以是-1,那么就把它作为一个可接受的有效终止条件。

bool check(int n) {
    for (;;) {
        if (n%2 == 0) {
            n /= 2;
        } else if (n%3 == 0) {
            n /= 3;
        } else if (n%5 == 0) {
            n /= 5;
        } else {
            break;
        }   
    }   

    return (n == 1) || (n == -1);
}

相关问题