PGR21.com
이전 질문 게시판은 새 글 쓰기를 막았습니다. [질문 게시판]을 이용바랍니다.
Date 2008/09/05 21:51:25
Name EZrock
Subject 프로그래머를 모으는 질문
전 절대 생각하지 않고 올리지 않습니다 네-_-)a;;

제가 만드는 프로그램은 특정 정수를 입력하면 그 정수까지의 모든 소수중에 가장 큰 소수를 찾는 프로그램입니다.

예를 들면 1000을 입력하면 997을 출력하는 식으로 말이죠.

제가 생각하기에는 이건 이중루프 외엔 해결할 방법이 없다고 생각했습니다.

그런데 오늘 친구가 이중루프 쓸 이유가 있냐고 하더군요.

while 한번만 써서 거꾸로 돌리면 된다고 말이죠.

여러가지 방법을 생각해 봤습니다만 1번만 돌려서 찾을려면 미리 그 정수사이에 존재하는 모든 소수를 알고 있어야지만 가능하다는 결론만 나왔습니다.

거꾸로 돌린다고 쳐도 소수를 입력받아서 1. 입력받은 정수부터 2까지(그 이후 과정은 1씩 줄이며) 2. 나눠서 나머지가 0이 되는 다른 정수가 있는가 찾는다면 어찌됐건 이중루프를 돌릴수가 없습니다.

혹시 루프 하나로 소수찾는 방법 알고 계신분이 있다면 올려주세요.

이것만 된다면 n²의 어마어마한 시간대를 n까지 줄일수 있으니까요.

n²형의 프로그램으로 12자리 돌렸는데 30분동안 결과가 안나오길래 껐습니다.

좋은 아이디어 많이 부탁드립니다.

통합규정 1.3 이용안내 인용

"Pgr은 '명문화된 삭제규정'이 반드시 필요하지 않은 분을 환영합니다.
법 없이도 사는 사람, 남에게 상처를 주지 않으면서 같이 이야기 나눌 수 있는 분이면 좋겠습니다."
08/09/05 22:07
수정 아이콘
n까지의 경우
n개의 flag를 만들어서 2부터 n/2까지 루프 돌려서 배수 플래그에 off해주면 on중에 가장 큰수가 답이 될것 같습니다.

생각해보니 이방법도 큰 수 앞에서는 무력할것 같네요...

ps. 루프 돌면서 off된 수는 배수처리 안해도 되고 on된 수만 해도 되겠네요
08/09/05 22:46
수정 아이콘
소수체크는 2부터 루트x까지만 해주면 됩니다.
답이 구간의 뒷부분에 있을걸로 예상되므로 루프 거꾸로 돌리면
시간복잡도가 n루트n보다 더 작은 정도가 되겠네요
O(n)의 방법이 있는지 정말 궁금하네요
08/09/05 23:17
수정 아이콘
뒤에서부터 돌린다면, 금방 찾겠죠. 수가 충분히 클 때, 소수 p 와 인접한 소수와의 거리(간격)은 대략 log p 정도라는 게 정수론에서 알려진 내용 중 하나인데..
N이 충분히 크다고 하면 N 이하의 최대 소수 P에 대하여 N≒P 이므로(?), 소수 검사에 드는 시간복잡도가 O(sqrt N) 라면 기대값으로 O(logN * sqrtN) 정도 되네요~ N이 12자리면 logN은 약 40~50 근처고(반복 횟수가) 실제로는 소수 검사할 때 커팅이 금방금방 되므로, 되게 빨리 나옵니다.

지금 막 짜봤는데 왠만한 64bit integer 까지는 금방 나오네요-_a 1초도 훨씬 안되는......


사실 sqrtN 의 시간복잡도보다 더 빠른 소수 검사 알고리즘이 존재합니다. 관심이 있으시면 찾아보세요-_-a
아직도 알고리즘 분야에서 많이 연구되고 있는 것 중 하나고, N이 어떤 특정 수 이하라는 조건만 있으면 (주로 실용적으로 쓰는 32bit 나 64bit에 대한 조건들) 매우 빠르게 동작합니다.

소스 첨부합니다.
#include <stdio.h>

bool isprime(__int64 p)

__int64 i;
if(p & 1) return 0;

for(i=3; i*i<=p; i+=2)
{
if(p % i == 0)
return 0;


return true;
}

int main()

__int64 n = 100000003500600;
for(__int64 p = n-1; p>=0; --p)
{
if( isprime(p) )
{
printf("%I64d\n", p);
break;

}
return 0;
}
08/09/05 23:22
수정 아이콘
덧 : 위의 isprime 함수는 완전하지 않습니다 [....] 1이나 2, 3, ... 등 아주 작은 special case 에 대해서는 조금 틀린데-_-; 문제에서 찾는 수가 엄청 크다는 조건 하에 대충 저렇게 적었습니다. 엄밀성을 위해서는 예외처리도 해주세요~
08/09/05 23:23
수정 아이콘
2002년도 즈음에 linear time에 소수 찾는 알고리즘이 발표되었던 걸로 기억하는데, 그 자료를 다시 찾아보려니까 잘 안 찾아지네요..
다익스트라 교수 타계 즈음이라 시기가 대충 기억나는데...
목록 삭게로! 맨위로
번호 제목 이름 날짜 조회
41758 뉴에라 모자요. [3] Star_ing2214 08/09/06 2214
41757 푸쉬업과 벤치프레스에 대해.. [6] TheOthers3005 08/09/06 3005
41755 윈도우에서 나오는 보안 경고에 대한 질문입니다. 오만과나태2131 08/09/06 2131
41754 TEN채널 작업남녀 질문입니다. [5] Enjoy3566 08/09/06 3566
41750 ITQ 인터넷에 관한 질문입니다. [2] 제갈공명토스3440 08/09/06 3440
41749 컴퓨터에 오류 같은 게 뜹니다. [8] Star_ing2038 08/09/06 2038
41748 수리영역..... [3] Juan1728 08/09/06 1728
41746 전자사전을 하나 구입하려고 합니다. [10] 연성연승2133 08/09/06 2133
41743 디카 캐논 400D 구입하려고 하는데요 [3] 이재열2239 08/09/06 2239
41742 제주도 펜션 질문 드립니다~ [2] 유안3236 08/09/06 3236
41741 휴대용게임기 잘아시는분?(psp,gp2x ?) [3] 무당스톰~*3377 08/09/06 3377
41739 이제동선수 온게임넷 탈락했나요? [4] 라이크2614 08/09/06 2614
41735 프로그래머를 모으는 질문 - 2 - [3] EZrock1707 08/09/06 1707
41734 과외 예비수업에 대한 질문!!! [2] lxl기파랑lxl1983 08/09/06 1983
41732 메이커 청바지 하나정도 필요한가요?? [15] 나를찾아서2938 08/09/05 2938
41731 이 가방 괜찮나요? 보시고 평가좀 해주세요.. [8] funnyday2825 08/09/05 2825
41730 톨플러스 써보신 분 계신가요? [1] slipzealot2103 08/09/05 2103
41729 운동화 믿고 살만한 사이트 좀 알려주세요~! [4] 악쓸2073 08/09/05 2073
41728 왕의 귀환이라는 맵에대해서, [3] 수입산 캐리어1829 08/09/05 1829
41727 군대 관련해서 질문 드립니다. [16] 신지용2086 08/09/05 2086
41726 헬스할려고 하는데 ...... [3] JIRO1851 08/09/05 1851
41725 프로그래머를 모으는 질문 [5] EZrock1828 08/09/05 1828
41724 자석과 철을 구별하는 방법요~ 비파괴, 도구 사용 x 일 때요.. [3] Whut!2427 08/09/05 2427
목록 이전 다음
댓글

+ : 최근 6시간내에 달린 댓글
+ : 최근 12시간내에 달린 댓글
맨 위로