• 카테고리

    질문 & 답변
  • 세부 분야

    알고리즘 · 자료구조

  • 해결 여부

    해결됨

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;


}

답변 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

OneLine님의 프로필

OneLine

질문자

2020.05.26

감사합니다! 이렇게 무한루프를 배워갑니다. 또한 해법이 아니었군요 감사합니다 :)