웹마스터 팁
page_full_width" class="col-xs-12" |cond="$__Context->page_full_width">
소수[솟수] 쉽게 구하기[에라토스테네스의 해 알고리즘사용] , 경우의 수 구하기
2004.10.23 13:51
소수[솟수] 쉽게 구하기
PHP기준으로 설명드리겠습니다.
자, 컴퓨터는 1억번의 for문[반복문]을 1초에 실행할수 있습니다.
보통 소수구하는것은 아래와 같이 쓰죠.
예 저 노가다합니다. ㅡ,.ㅡ;;
for($i=2;$i <= 1000;$i++)
{
for($j=2;$j <=i;$j++)
{
if($i %$ j == 0)
{
$cnt++;
}
}
if($cnt != 1)
{
echo "$i 는 소수가 아닙니다.";
}
$cnt = 0;
}
뭐..더 쉬운방법도 있겠지만 보통 위와같이 씁니다.
1000정도는 금방할수있겠지만 100만이 넘을경우 1초가 넘어가는 경우가 있습니다.
1초가 넘는것쯤이야 PHP에서는 간단할지몰라도 c++로
프로그래밍 대회에 나가는경우에는 제한이 1초입니다.
그러므로 소수를구할때는 소수의 최적화인 에라토스테네스의 해를 사용하는것이 가장 좋습니다.
그럼, 에라토스테네스의 해 알고리즘을 보도록하죠.
먼저 배열을 하나 잡아놓습니다.
그리고 2[배열번호]에는 0을 넣어놓습니다.
그후 for문을 2부터 원하는수까지 돌립니다.
그리고, 만약 배열의 i[for문 변수]번째방에 있는 값이 1이 아니라면
i의 배수방을 모두 1로 바꿔줍니다.
주의 : i번쨰 방은 0으로 넣어주세요.
그런식으로 계속 반복을 해나가면 훨씬 수월하게 소수[솟수]를 구할수 있을겁니다.
경우의 수 구하기 ---
타일채우기 문제와 비슷합니다.
대충 문제를 살펴보면
2 * n크기의 판이 있다. 그 판에 타일을 채우려고한다.
타일의 종류는 세로로 2*1타일, 가로로 2*1타일과 2*2타일이 있다.
이 세가지 타일로 모두 채울수 있는 경우를 알아내어라.
이 문제..
입출력 예를 봅시다.
입력
2
8
12
출력
3
171
2731
이 문제를 풀기는 좀 복잡할거같지 않습니까?
전혀 그렇지 않습니다.
2진수를 사용하면 아주 간편한 방법으로 문제를 풀수 있습니다.
알고리즘은 아래와 같습니다.
예를들어.. 수가 7이라면 7-1, 즉 6번까지
1010...이런식으로 반복을 해나갑니다.
그리고 맨마지막 7번째 수는 1로 합니다.
그러면 수가 아래와같이 되겠죠.
1010101
위와 같이 한것을 10진수로 바꾸면 답이 됩니다.
즉,
짝수 8을 또 예로 보면
8-1,즉 7번까지 2진수로 1010을 반복하면
1010101
위와같이 되죠.
그 뒤에 1을 붙이면
10101011
이 됩니다.
이 수를 10진수로 바꾸시면 답인 171이 나옵니다.
이렇게 문제를 이리 굴려보고 저리 굴려보고 생각을 해보면
최적해와 최소의 시간, 그리고 쉬운방법으로 문제를 풀수 있습니다.
그럼, 이상 타키의 허접팁이였습니다.
PHP기준으로 설명드리겠습니다.
자, 컴퓨터는 1억번의 for문[반복문]을 1초에 실행할수 있습니다.
보통 소수구하는것은 아래와 같이 쓰죠.
예 저 노가다합니다. ㅡ,.ㅡ;;
for($i=2;$i <= 1000;$i++)
{
for($j=2;$j <=i;$j++)
{
if($i %$ j == 0)
{
$cnt++;
}
}
if($cnt != 1)
{
echo "$i 는 소수가 아닙니다.";
}
$cnt = 0;
}
뭐..더 쉬운방법도 있겠지만 보통 위와같이 씁니다.
1000정도는 금방할수있겠지만 100만이 넘을경우 1초가 넘어가는 경우가 있습니다.
1초가 넘는것쯤이야 PHP에서는 간단할지몰라도 c++로
프로그래밍 대회에 나가는경우에는 제한이 1초입니다.
그러므로 소수를구할때는 소수의 최적화인 에라토스테네스의 해를 사용하는것이 가장 좋습니다.
그럼, 에라토스테네스의 해 알고리즘을 보도록하죠.
먼저 배열을 하나 잡아놓습니다.
그리고 2[배열번호]에는 0을 넣어놓습니다.
그후 for문을 2부터 원하는수까지 돌립니다.
그리고, 만약 배열의 i[for문 변수]번째방에 있는 값이 1이 아니라면
i의 배수방을 모두 1로 바꿔줍니다.
주의 : i번쨰 방은 0으로 넣어주세요.
그런식으로 계속 반복을 해나가면 훨씬 수월하게 소수[솟수]를 구할수 있을겁니다.
경우의 수 구하기 ---
타일채우기 문제와 비슷합니다.
대충 문제를 살펴보면
2 * n크기의 판이 있다. 그 판에 타일을 채우려고한다.
타일의 종류는 세로로 2*1타일, 가로로 2*1타일과 2*2타일이 있다.
이 세가지 타일로 모두 채울수 있는 경우를 알아내어라.
이 문제..
입출력 예를 봅시다.
입력
2
8
12
출력
3
171
2731
이 문제를 풀기는 좀 복잡할거같지 않습니까?
전혀 그렇지 않습니다.
2진수를 사용하면 아주 간편한 방법으로 문제를 풀수 있습니다.
알고리즘은 아래와 같습니다.
예를들어.. 수가 7이라면 7-1, 즉 6번까지
1010...이런식으로 반복을 해나갑니다.
그리고 맨마지막 7번째 수는 1로 합니다.
그러면 수가 아래와같이 되겠죠.
1010101
위와 같이 한것을 10진수로 바꾸면 답이 됩니다.
즉,
짝수 8을 또 예로 보면
8-1,즉 7번까지 2진수로 1010을 반복하면
1010101
위와같이 되죠.
그 뒤에 1을 붙이면
10101011
이 됩니다.
이 수를 10진수로 바꾸시면 답인 171이 나옵니다.
이렇게 문제를 이리 굴려보고 저리 굴려보고 생각을 해보면
최적해와 최소의 시간, 그리고 쉬운방법으로 문제를 풀수 있습니다.
그럼, 이상 타키의 허접팁이였습니다.
댓글 5
-
에지
2004.10.23 14:10
어느쪽이든간에 팁은 한쪽에만 올리시는게;;; -
ongam.com
2004.10.23 20:32
저 소스 너무 최적화가 안되있는데. -
앳플군
2004.10.24 09:17
이런 식으로 하기에는 큰 수의 경우 시간이 오래 걸립니다.
또한 큰 수 알고리즘도 필요하고요.
16개 숫자만 되도 버벅댈텐데요 -
타키
2004.10.24 09:57
앳플군//일단 2진수를 만드는것까지는 시간이 별로 안들죠.
10진수로 교환하는 단계에서 시간이 많이 드니.. 그곳에서도 또 최적해 알고리즘을 사용하면 되겠죠..아마?-_-... -
양영직
2004.10.25 03:12
어.....이 고전적인 에라토스테네스 의 방법은 컴퓨터에 그다지 적합하지 않은걸로 낙인되왔습니다.... RSA암호 때문에 소수판별법과 소수 구하기에 엄청난 수학적인 진보가 이루어졌지만....
여전히 엄청난 자리수에 대해서는 며칠(수퍼컴퓨터로 -_-) 이 걸리는 알고리즘들이 대부분입니다...어쩌면 소수에관한 문제들은 양자컴퓨터 이전에는 풀수 없는 걸 지도 모를......
근데 나는 뭔주제에 자꾸 타키님에게 태클을 걸지?
제목 | 글쓴이 | 날짜 |
---|---|---|
개판 오분전 라인 그래프 [4] | 미친개 | 2004.12.01 |
실명 진위여부 확인 [10] | piasol | 2004.12.01 |
나만의 미니홈 만들기 ㅡ write.php 파일과 write_ok [5] | 예뜨락 | 2004.11.30 |
나만의 미니홈 만들기 ㅡ view.php 파일과 제목링크 [9] | 예뜨락 | 2004.11.27 |
나만의 미니홈 만들기 ㅡ list.php , 디비 테이블 생성 [6] | 예뜨락 | 2004.11.26 |
나만의 미니홈 만들기 ㅡ 게시판 list.php 파일의 모양새 [6] | 예뜨락 | 2004.11.23 |
나만의 미니홈 만들기 ㅡ 게시판의 디자인 | 예뜨락 | 2004.11.22 |
나만의 미니홈 만들기 ㅡ 미니홈 생성 페이지 [3] | 예뜨락 | 2004.11.20 |
나만의 미니홈 만들기 ㅡ 기초적인 관리 페이지 [3] | 예뜨락 | 2004.11.20 |
나만의 미니홈 만들기 ㅡ 메인 기초 설계3 .레이아웃 [2] | 예뜨락 | 2004.11.19 |
나만의 미니홈 만들기 ㅡ 메인 기초 설계2 .레이아웃 | 예뜨락 | 2004.11.18 |
나만의 미니홈 만들기 ㅡ 글쓰기에 앞서... [1] | 예뜨락 | 2004.11.17 |
[타키의 초보강좌]PHP 기초 강좌 제 2탄[mysql로 들어가보자.] [2] | 타키 | 2004.10.24 |
소수[솟수] 쉽게 구하기[에라토스테네스의 해 알고리즘사용] , 경우의 수 구하기 [5] | 타키 | 2004.10.23 |
[타키의 초보강좌]PHP 기초 강좌 제 1탄[패스워드 인증] [8] | 타키 | 2004.10.23 |
www자동 붙히기 [8] | 미오유 | 2004.10.22 |
IP to 정수변환(;) [4] | 플로렐라 | 2004.10.21 |
한글자르는 문제 PHP차원에서 해결된 건가? [5] | 겜방 | 2004.10.20 |
MySQL의 패턴 매칭 맛보기 [2] | 손상모 | 2004.10.19 |
그래프 만들어주는 소스 [10] | 미친개 | 2004.10.15 |