【问题标题】:Integer division by zero c++整数除以零 c++
【发布时间】:2014-02-16 09:30:02
【问题描述】:

我必须编写一个程序,输入一个数字并输出它的最高除数,然后输出除数的最高除数,依此类推,直到它达到素数。但我不断得到: “primefinder.exe 中 0x00eb1504 处未处理的异常:0xC0000094:整数除以零。”

我猜是导致它的“num%i”,但“i”不能为零,因为它的“num/2”。

#include <iostream>

using namespace std;

int main(){
    unsigned int i=666, num;
    cout << "Enter number";
    cin >> num;
    while(i>1){
        i = num/2;
        while(num % i == 0){
            i--;
        }
        cout << i << endl;
        num=i;
    }
    cin.get();
    return 0;
}

【问题讨论】:

  • 你检查过num 是从什么开始的吗?如果结果为零,则 i 为零,并且您正在为您的 % 模运算除以零,然后繁荣就会出现错误。
  • 如果 num 变为 1,则 num/2 将为零(除以整数)。

标签: c++


【解决方案1】:

正如 ooga 在他的评论中提到的那样,由于整数数学,1/2(和 0/2)将等于零。

为避免此处被 0 除,请将cin &gt;&gt; num; 更改为:

do
{
    cin >> num;
} while (num <= 1);

这将继续提示,直到输入有效数字。

编辑: Cornstalk's Answer 正确指出您必须使用 i &gt; 0 &amp;&amp; num % i == 0 保护最内层的 while 循环。

【讨论】:

    【解决方案2】:

    如果i 为零,则num % i 会导致此错误。这什么时候会发生?假设您将数字 2 作为输入。然后它执行为:

        i = num/2; // i is now (2 / 2) = 1
        while(num % i == 0){ // 2 % 1 = 0, so the loop continues
            i--; // i is now zero, so the next loop iteration will cause a division by zero!
        }
    

    所以你需要这样做:

    while(i > 0 && num % i == 0)
    

    确保i 永远不会为零。

    【讨论】:

      【解决方案3】:
      int main(){
          unsigned int i=666, num;
          cout << "Enter number";
          cin >> num;
          while(i>1){
              i = num/2;
      

      为什么用666初始化i,然后立即分配i=num/2

      顺便说一句,“输入一个数字并输出它的最高除数,然后输出除数的最高除数等等”似乎是递归算法的一个很好的候选者。

      【讨论】:

      • 调试器在第一个“while”循环中出错,因为“i”未定义,所以我只是将其定义为大于 1 的随机(实际上不是)值,我可以使用“do”循环。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-18
      • 2021-02-26
      • 2014-12-06
      • 1970-01-01
      相关资源
      最近更新 更多