2014-11-11 4 views
0

이 코드를 실행하는 동안 부동 소수점 예외가 발생하는 이유는 pls가 왜 그렇게 오는지 설명합니다.C 프로그램에서 부동 소수점 예외

#include <stdio.h> 
int gcd(long int, int); 
int main() { 
    int t, n, a, i; 
    long int abc; 
    scanf("%d", &t); 
    while (t--) { 
     abc = 1; 
     scanf("%d", &n); 
     abc = n * (n - 1); 
     for (i = n - 2; i > 1; i--) { 
      a = gcd(abc, i); 
      abc = ((abc * i)/a); 
     } 
     printf("%ld \n", abc); 
    } 
    return 0; 
} 
int gcd(long int a, int b) { 
    if (b == 0) 
     return a; 
    else { 
     return (b, a % b); 
    } 
} 
+4

문구가 어둡다는 이유로 문단을 이해할 수 있습니다. –

+2

itsokicanreadthingslikethatorrathere 행글라이더가 –

+0

이 프로그램에 어떤 정보를 제공합니까? –

답변

4

gcd 함수의 다른 부분은 가짜이다. gcd을 반복적으로 호출하고 a % b을 반환하는 것이 좋습니다. 결과적으로 a % b == 0을 13 행으로 0으로 나눈 경우 (b, a % b)은 쉼표 연산자로 구분 된 두 개의 하위 표현식으로 평가됩니다. b의 값은 잊어 버리고 전체 식의 값은 a % b이됩니다.

올바른 버전 :

int gcd(long int a, int b) { 
    if (b == 0) 
     return a; 
    else { 
     return gcd(b, a % b); 
    } 
} 
0

당신은 몇 가지 변경해야합니다 :

1) if(a == 0) 대신 b==0return을 변수 b
2)를 사용하여 재귀 gcd(b%a, a)

if (a == 0) 
     return b; 
    else { 
     return gcd(b%a, a); 
    } 

그리고 이것을 사용할 수도 있습니다. 읽힌 버전

return a ? gcd(b%a,a) : b; 

증명 :

우리는 m = n * (m div n) + m Mod n 있습니다.

m div 1 = mm mod 1 =0이기 때문에이 수식은 심지어 if n = 1이라도 정확합니다.

nm 모드 N은 d의 여러 있다면, 또한 mn * (m div n)m mod n/d 때문에 d의 여러이다. 한편

mnm mod n = m -n * (m div n)e의 여러이기 때문에, e의 여러 경우.