kkw564   8년 전

다리 놓기 문제도 결국 컴비네이션 이용 문제인데


이항계수 문제가 왜 틀리는지 모르겠습니다 ㅠㅠ


도와주세요.. 8번째 과락입니다..

cseteram   8년 전

n=0 이면 sum이 inf가 됩니다.

kkw564   8년 전

n 과m이0일때 0을출력하고종료하는데 틀린건가요?

cseteram   8년 전

코드 기준으로 m=10, n=0이라면 10C0 = 1을 출력해야 하는데,

이 경우 m==0 && n==0 가 false이므로 if 문에 걸리지 않고 while문으로 들어갑니다. 따라서 inf가 나오겠지요.

kkw564   8년 전

10 0 입력하면 결과는 1이 나옵니다..


inf가 무슨뜻인지를 모르겠네요 혹시 inf가 뭔지도 좀 알려주실수있나요??

cseteram   8년 전

컴파일러 설정이 궁금하네요. 우선 ideone에 넣어보면 출력이 inf가 나옵니다.

http://ideone.com/6OwWSK

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 이 커지면 틀릴 수도 있을 거 같아요.

kkw564   8년 전

저는 dev-c++을 이용중입니다.

m = 10, n = 0이 들어가면 먼저 m--; n--;가 이루어집니다.

그리고 while문에서 n>0조건에 만족하지 않으므로 바로 sum을 출력합니다.

sum의 초기값은 0이기에 10C0는 0이라는 답과 일치합니다.

지금 제 코드에서는 나누기 0을 하는 부분은 딱히 없다고 생각했습니다. while(n > 0) 이부분에서 나누기 0부분을 잡아내고 있고

그위에서 몇가지 if문으로 0일때, 0이하일때의 조건을 고려해주고 있다 생각했습니다.


혹시 제 의견이 틀렸으면 어디가 틀렸는지 지적해주시면 정말 감사하겠습니다.

많은 도움 주셔서 감사합니다..

kkw564   8년 전

#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에서 잡아내주지 않았었네요.. 흠..

혹시 저위의 코드는 어디가 틀린건가요..? 고집이라 하면 고집인데 이 코드로 끝내보고싶네요..

cseteram   8년 전

네, 이제 sum에 inf가 대입되는 경우는 없어보입니다.

다시 m=10, n=0으로 돌아가서, 이 경우는 10C0 = 1 인데, 0을 출력합니다.

n==0 일 때 1을 출력하도록 고치시면 될 것 같아요.


0C0 의 경우는, 저는 1이라고 생각하지만 조금 애매하네요.

그런데 문제의 input범위에서 둘 다 0인 경우는 없으니 신경쓰지 않으셔도 될 것 같습니다.

kkw564   8년 전

감사합니다 해결했습니다.

코드에 집착하다보니 마지막엔 조금 지저분해졌네요.. 정말감사드립니다 !

댓글을 작성하려면 로그인해야 합니다.