c++语法错误:程序以非零状态退出

C++ Syntax Error: Program Exited With Non-Zero Status

本文关键字:状态 退出 程序 语法 错误 c++      更新时间:2023-10-16

我使用的是repl。来写我的c++。到目前为止,我已经学习了条件、循环和函数。现在我要写一个程序,输入两个整数找出最小公倍数和最大公分母。到目前为止,我已经写了大部分的代码,但是有一个问题。

"已退出非零状态"

#include <iostream>
using namespace std;
int main() 
{
int number1 = 0;
int number2 = 0;
int calc = 0;
int lcm = 0;
cout << "Give me two integers, and I will calculate the Least Common Multiple and the Greatest Common Divisor." << endl;
while (number1 <= 0) {
    cout << "Enter your first number. Cant be negative" << endl;
    cin >> number1; }
while (number2 <= 0) {
    cout << "Enter your second number. Cant be negative" << endl;
    cin >> number2; }
while(number2 != 0) { ///Greatest Common Divisor
    calc = number1 % number2;
    lcm = (number1*number2) / calc;
    number1 = number2;
    number2 = calc;
}

cout << "Least Common Multiple is " << lcm << endl;
cout << "Greatest Common divisor is " << number1 << endl;
}

所以我不确定这是语法错误还是因为repl。但我真的很想弄清楚这件事。

谢谢

While循环在循环结束时检查number2的值,但是当您计算calc时,有时该值为零,然后在下一步程序以除零异常退出。您可以通过在计算calc变量后将这一行添加到代码中来防止此问题:

if (calc == 0 ) break;

另外,你的代码不能正常工作,例如设置number1 = 30和number2 = 18!

先用二进制法计算GCD,再用GCD计算LCM。

            #include <iostream>
            #include <math.h>   //  for pow(2,d)
            using namespace std;

            int main() 
            {
                int gcd, lcm, a, b, g, number1 = 0, number2 = 0, d=0;
                cout << "Give me two integers, and I will calculate the Greatest Common Divisor and the Least Common Multiple." << endl;
                while (number1 <= 0) {
                    cout << "Enter your first number. Cant be negative" << endl;
                    cin >> number1; 
                }
                // using binary method to calculating GCD:   https://en.wikipedia.org/wiki/Greatest_common_divisor
                while (number2 <= 0) {
                    cout << "Enter your second number. Cant be negative" << endl;
                    cin >> number2; 
                }    
                a = number1;
                b = number2;
                while (((a%2)==0) && ((b%2)==0)) {
                    a = a/2;
                    b = b/2;
                    d = d+1;
                }
                while (a != b) {
                    if ((a%2) == 0) {
                        a = a/2;
                    } else if ((b%2)==0) {
                        b = b/2;
                    } else if (a>b) {
                        a = (a-b) /2;
                    } else {
                        b = (b-a)/2;
                    }
                }
                g = a;
                cout << "ng: " << g << "td: " << d << "tpower(2,d): " << pow(2,d);
                gcd = g * pow(2,d); // power(2,d) with math.h library
                lcm = (number1*number2)/gcd;   // according to LCM(a,b) = (a*b)/GCD(a,b)
                cout << "nGreatest Common Divisor is " << gcd << " and Least Common Multiple is " << lcm << endl;
            }

首先,您需要检查哪个数字更大,因为如果您设置number1=18number2=30,那么number1%number2将是18,然后您看到它的去向-错误的输出。此外,Hossein Nazari建议的修复可以很好地避免异常,但是如果遵循该修复,您的GCD将存储在number2中。例如30和18:

30%18 = 12
calc = 12
if(calc==0) break;
(lcm routine)
number1 = 18
number2 = 12
18%12 = 6
calc=6
if(calc==0) break;
(lcm routine)
number1 = 12
number2 = 6
12%6=0
calc=0
if(calc==0) break;
<done>

我宁愿完全从循环中删除lcm计算,在这种情况下,您将按计划在number1中获得GCD,然后只需通过公式(number1*number2)/GCD计算lcm,即30*18/6 = 90;

我来修改一下数据类型

float calc = 0;
float lcm = 0;

嗨@Cheers和hth,我已经在这里执行了代码https://www.tutorialspoint.com/compile_cpp11_online.php,并得到了这个异常-浮点异常,在我将数据类型从int改为float之后,我得到了这个值输入你的第一个号码。不能为负
10
输入第二个号码。不能为负
20
最小公倍数是inf
最大公约数是10