我必须编写一个程序,输入一个数字并输出它的最高除数,然后输出除数的最高除数,依此类推,直到达到一个素数。但我一直在努力: “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;
}
答案 0 :(得分:1)
正如ooga在评论中提到的,由于整数数学,1/2(和0/2)将等于零。
要避免在此处除以0,请将cin >> num;
更改为:
do
{
cin >> num;
} while (num <= 1);
这将继续提示,直到输入有效数字。
编辑: Cornstalk's Answer正确地指出您必须使用i > 0 && num % i == 0
保护最内层的循环。
答案 1 :(得分:1)
如果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
永远不会为零。
答案 2 :(得分:0)
int main(){
unsigned int i=666, num;
cout << "Enter number";
cin >> num;
while(i>1){
i = num/2;
为什么要用666初始化我,然后立即指定i=num/2
顺便说一句,“输入一个数字并输出它的最高除数,然后是除数的最高除数,依此类推”似乎是递归算法的一个很好的候选者。