jhj950912   3년 전

for (int i=2; i<sqrt(N); i++)

로 푸신 분들 꽤 계시던데

N이 14인 경우 N의 루트 값은 4.xx

14의 소인수는 2 와 7인데

이 경우 7이 출력 안 되지 않나요?

어떻게 푸신 건지 설명 좀 부탁드립니다..

sonjaewon   3년 전

3.xx 입니다

2가 소인수이니

14/2=7 즉 7도 소인수가  돼죠

sonjaewon   3년 전

그리고 부등호에 = 이

붙어야 합니다

jhj950912   3년 전

아 맞습니다 감사합니다.

for (int i=2; i<=sqrt(N); i++) 와 3.xx 로 정정하겠습니다.

제 질문의 요지는, 문제가 모든 소인수를 출력해야 하는 것인데

14의 값이 들어간 경우 2는 정상적으로 출력될 것이나

7의 경우는 sqrt(N) 이 3.xx, 따라서 7<=3.xx 가 성립되지 않으므로 7이 출력되지 않고

그럼 정답이 아니지 않나 하는 것입니다.

exponential_e   3년 전

코드에서 sqrt(N)까지 돌리는 이유가 무엇인지 잘 생각해보세요.

아래의 코드처럼 리스트에 저장하고, 이후 정렬해서 출력하면 되지 않을까요?

(@sonjaewon님이 말씀하신 것과 같은 이야기 입니다.)

sonjaewon   3년 전

배열같은 곳에다가

sqrt(N) 이하인 소인수를 다 넣은 후,

출력할때 arr[i] 뿐만 아니라 N / arr[i] 도 출력하면 됩니다.

sonjaewon   3년 전

아, 이건 소인수분해 하는 문제네요

이상한거 알려드려서 죄송합니다.

제가 알려드린거에서 조금만 더 확장(?) 하면 소인수분해 코드를 구현할수 있씁니다.

wider93   3년 전

완성된 버전의 답변이 없는 것 같아서 정리드리겠습니다.
r = sqrt(N)까지 다 나눠봤을 때 에라토스테네스의 체에서 합성수가 전부 걸러지는 원리는 다음과 같습니다:

1. n = ab <= N 이면, a <= r 또는 b <= r이다.

r까지 다 나눠보아서 소인수분해를 할 수 있는 원리는 위에서 파생됩니다.

2. n = ab이고 r보다 큰 소인수가 전부 a에 있으면, b는 합성수가 아니다.(즉 1 또는 소수겠죠)

조금 더 생각해보면 1에서 n = N으로 쓰듯, 2번에서는 r을 sqrt(N) 대신 sqrt(b)로 대체해도 좋은 것을 알 수 있습니다. 이 버전은 반복문에서 쓰기 매우 좋은 형태가 됩니다.

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