10으로 나눠지는 갯수를 세는 코드로 짜보았습니다. 예제를 돌리면 틀린 경우가 발생하는데 어느 부분일까요?
int main()
{
int N, a, b, tmp, cnt = 0;
cin >> N;
vector<int> fac(N);
for (int i = 0; i < N; i++) {
fac[i] = N - i;
}
int i = 0;
while(1) {
if (i<N) {
a = fac[i];
b = fac[i + 1];
tmp = (b * a);
while (tmp % 10 == 0) {
cnt++;
tmp = tmp / 10;
}
i = i + 2;
}
else
break;
}
cout << cnt;
return 0;
}
답변 2
1
문제점이 두가지 있습니다.
첫 번째는 N값으로 홀수가 입력되면 while (tmp % 10 == 0) 에서 무한루프에 빠집니다. 만약 N=5가 입력되면 둘씩 짝을 이루며 처리하다가 마지막에 i=4일때 a=1되고 b는 fac[i+1]가 index out of range 에러가 되어 b에 0이 대입됩니다(gcc 컴파일러 기준). C언어는 index out of range를 에러처리 하지 않습니다. 프로그래머가 조심해야 합니다. b가 0이면 tmp가 0이 되어 while (tmp % 10 == 0) 문이 무한루프에 빠지는 것입니다.
두번째는 둘씩 곱한 다음 0을 찾는 방법은 정답을 찾는 해법이 아닙니다. 50*49*48*47 값을 위에 코드대로 두개씩 짝지어 곱한 후 0의 개수을 찾으면 1개 발견됩니다. 하지만 50*49*48*47 계산을 한 결과는 일의 자리부터 연속으로 0이 2개입니다.
테스트 케이스 질문
0
373
1
병합정렬 시간복잡도 질문
0
462
1
41.연속된 자연수의 합 문제풀이에서 수학적인 원리를 모르고 있습니다.
0
1345
2
질문드립니다.
0
376
1
질문드립니다!
0
430
1
dev 프로그램 질문
0
275
1
문제가 이해가 안되요
0
376
1
4번 나이차이 문제 접근법 질문 드립니다.
0
307
1
source file not compiled
0
1047
3
59번 질문드립니다.
0
372
1
25번 문제 질문
0
349
1
4. 나이차이 문제 질문입니다.
0
372
1
90번 라이언 킹 심바 1번 테스트 케이스
0
470
1
71번 문제 전역 변수 질문 있습니다
0
365
1
75번, 79번 priority_queue관련
1
355
1
75.최대 수입 스케줄
0
400
2
복면산 정답의 수
0
431
1
테스트 케이스에 대해서
0
445
1
수업 내용 질문입니다!
1
232
1
풀어보면 좋은 문제 목록 - 2580 스토쿠 DFS 질문입니다!!
0
822
2
12. 플로이드-와샬(그래프 최단거리) . 27:25초
0
254
1
다른 풀이 방식
0
317
1
크루스칼 vs 프림
0
306
1
숫자 총개수 small 질문있습니다.
0
242
1





