inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

it 취업을 위한 알고리즘 문제풀이 입문 (with C/C++) : 코딩테스트 대비

28. N!에서 0의 개수(소인수분해 응용)

10으로 나눠지는 갯수를 세는 코드로 짜보았습니다. 예제를 돌리면 틀린 경우가 발생하는데 어느 부분일까요?

해결된 질문

215

OneLine

작성한 질문수 5

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;


}

C++ 코테 준비 같이 해요!

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

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

테스트 케이스 질문

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