为什么会出现浮点异常8?

时间:2018-11-01 04:23:15

标签: c greatest-common-divisor

对于我的简介。参加编程考试复习时,我被要求编写一个程序,该程序使用一个函数来计算一组数字的gcd。我编写了以下代码,有时似乎可以正常工作,但其他代码则返回Floating Point Exception8。我希望有人能对此有所了解。

我在使用macOS High Sierra的mac终端上使用clang gcd.c -o gcd进行了编译,返回FP错误的数字为5372 18960 -230048 1185 16486

这是代码:

#include <stdio.h>
#include <stdlib.h>

int gcd(int a, int b){
    if((a==0) || (b==0)){
        return 0;
    }else{
        if( a % b == 0 ){
            return b;
        }else{
            if ( b % a == 0 ){
                return a;
            }
        }
    }
    while( (a != 0) && (b != 0) ){
        if (abs(a)>abs(b)){
            a = abs(a) % abs(b);
        }
        if(b>a){
            b = abs(b) % abs(a);
        }
    }
    if (a == 0){
        return b;
    }else{
        return a;
        }
}

int main(void){
    int n;
    printf("Please enter the number of integers in your array:\n");
    scanf("%d", &n);

    int a[n];

    printf("Please enter the numbers in your arrray:\n");

    for (int i = 0; i < n; ++i){
        scanf("%d", &a[i]);
    }

    for (int i = 0; i < (n-1); ++i){
            a[i] = gcd(a[i], a[i+1]); 
    }

    printf("The gcd of the %d numbers is %d .\n", n, a[n-2]);

    return 0;
}

2 个答案:

答案 0 :(得分:2)

在查找GCD的代码中似乎有一些错误。

您应该在for循环中更新a[i+1]的值,而不是a[i]。 GCD将是此更改之后的第a[n-1]个元素。当您遍历循环时,a[i]a[i+1]将是您所用的原始(输入)值。因此,如果一切正常,您的结果将是数组最后两个元素(a[n-2]a[n-1])的GCD。

for (int i = 0; i < (n-1); ++i) {
    a[i+1] = gcd(a[i], a[i+1]); 
}

while的{​​{1}}循环中,您需要进行以下更改。检查gcd()条件,并将两个a==b条件更改为if条件。如果if-elseb的因数,则在您的第一个a条件下,a变成0。然后在第二种情况下,您正在执行if,这会引发错误。

% 0

答案 1 :(得分:2)

下面while循环中的第一印象

while( (a != 0) && (b != 0) ){
    if (abs(a)>abs(b)){
        a = abs(a) % abs(b); // value of a is altered and reused 
    }
    if(b>a){
        b = abs(b) % abs(a);  // here <-- and could very well be a 0
    }
}

在完全不同的音符上,如果您花一点时间看else {}块并没有真正增加任何值,则可以删除else块,因为{中有return {1}}

if