-
카테고리
-
세부 분야
알고리즘 · 자료구조
-
해결 여부
해결됨
10으로 나눠지는 갯수를 세는 코드로 짜보았습니다. 예제를 돌리면 틀린 경우가 발생하는데 어느 부분일까요?
20.05.24 22:48 작성 조회수 121
0
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;
}
답변을 작성해보세요.
1
김태원
지식공유자2020.05.25
문제점이 두가지 있습니다.
첫 번째는 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
답변 2