n=0 이면 sum이 inf가 됩니다.
11050번 - 이항 계수 1
컴파일러 설정이 궁금하네요. 우선 ideone에 넣어보면 출력이 inf가 나옵니다.
ideone에서의 컴파일러 버전(g++ 5.1)과 옵션이 홈페이지와 약간 다르긴 하지만,
홈페이지에 명시된 버전(g++ 4.8)과 컴파일 옵션을 줘도 결과는 아마 동일할 겁니다.
inf (infinity) 는 실수형 자료에서 0이 아닌 값을 0으로 나누었을 때 들어가는 값입니다. (ex. double t = 2/0.0)
쉽게 말하자면 무한대. 어떤 실수보다도 크다는 것을 나타내는 기호이지요.
내부적으로 표현하는 방법이 있는데 이건 제쳐두고요...
11번째 line을 보시면, sum에 (double)m/(double)n을 대입하는데요.
입력으로 m=10, n=0이 들어왔다면 10.0/0.0 을 대입하는 거라 sum으로 inf가 들어가게 됩니다.
이후에 이 sum으로 sum = sum * m 이라던가, sum = sum / n을 해도 sum에는 계속 inf가 들어갑니다.
따라서 최종적으로 printf로 sum을 출력하여도 inf가 나옵니다.
n=0일 때 예외 처리를 따로 해주면 억셉이 될 것입니다.
그런데 이 문제에서는 n,m 값이 작아서 실수 오차 때문에 답이 틀리는 경우는 없을 것 같은데,
n,m 이 커지면 틀릴 수도 있을 거 같아요.
저는 dev-c++을 이용중입니다.
m = 10, n = 0이 들어가면 먼저 m--; n--;가 이루어집니다.
그리고 while문에서 n>0조건에 만족하지 않으므로 바로 sum을 출력합니다.
sum의 초기값은 0이기에 10C0는 0이라는 답과 일치합니다.
지금 제 코드에서는 나누기 0을 하는 부분은 딱히 없다고 생각했습니다. while(n > 0) 이부분에서 나누기 0부분을 잡아내고 있고
그위에서 몇가지 if문으로 0일때, 0이하일때의 조건을 고려해주고 있다 생각했습니다.
혹시 제 의견이 틀렸으면 어디가 틀렸는지 지적해주시면 정말 감사하겠습니다.
많은 도움 주셔서 감사합니다..
#include <stdio.h>
int main()
{
int T,n,m,i, check = 0;
double sum = 0;
scanf("%d %d",&m,&n);
if(n < 0) {printf("0"); return 0;}
else if(n > m) {printf("0"); return 0;}
else if(n == 0) {printf("0"); return 0;}
sum = (double)m / (double)n;
if(0 <= n && n <= m)
{
if(n == 0 && m ==0){ printf("0"); return 0;}
m--;
n--;
while(n > 0)
{
if(check == 0)
{
sum = sum * (double)m; // 컴비네이션 쓰면 값이 커져서 분할시켰다.
m--;
check = 1;
}
else if(check == 1)
{
sum = sum / (double)n;
n--;
check = 0;
}
}
printf("%.f",sum);
}
return 0;
}
코드를 이렇게 다시 수정했습니다.
teram 님의 말씀이 맞았습니다. inf구간이 있는데 dev-c에서 잡아내주지 않았었네요.. 흠..
혹시 저위의 코드는 어디가 틀린건가요..? 고집이라 하면 고집인데 이 코드로 끝내보고싶네요..
댓글을 작성하려면 로그인해야 합니다.
kkw564 8년 전
다리 놓기 문제도 결국 컴비네이션 이용 문제인데
이항계수 문제가 왜 틀리는지 모르겠습니다 ㅠㅠ
도와주세요.. 8번째 과락입니다..