JavaScript小数点の検索


プログラマコードテスト練習問題


問題は,1からnまでの少数の数を返す関数を記述することである.
小数(prime number)は자신보다 작은 두 개의 자연수를 곱하여 만들 수 없는 1보다 큰 자연수.또는 1과 자신 이외의 자연수로는 나눌 수 없는 자연수と定義することもできる.
素数という概念さえよく知られていないので、どのように解くかは難しいが、ウィキペディアを探すときに素数を探す方法を見つけ、コードに方法を移した.
function solution(n) {
    let answer = 0;
    let arr = [0,0];	// 0과 1은 소수가 아니다.

    for(let i=2; i<=n; i++)	// 우선 n까지의 수를 배열에 입력한다.
        arr[i]=i;

    for(let i=2; i<Math.sqrt(n); i++){ // n의 제곱근보다 작은 수의 배수들만 지우면 된다.
        if(arr[i])
            for(let j=i*2; j<=n; j+=i)
                arr[j] = 0;	// 조건에 들어오는 수의 배수들을 모두 0으로 초기화.
    }

    return arr.filter(x => x > 0).length;
}
에라토스테네스의 체の少数の方法を探しています.
1. 2부터 소수를 구하고자 하는 구간의 모든 수를 나열한다. 그림에서 회색 사각형으로 두른 수들이 여기에 해당한다.

2. 2는 소수이므로 오른쪽에 2를 쓴다. (빨간색)

3. 자기 자신을 제외한 2의 배수를 모두 지운다.

4. 남아있는 수 가운데 3은 소수이므로 오른쪽에 3을 쓴다. (초록색)

5. 자기 자신을 제외한 3의 배수를 모두 지운다.

6. 남아있는 수 가운데 5는 소수이므로 오른쪽에 5를 쓴다. (파란색)

7. 자기 자신을 제외한 5의 배수를 모두 지운다.

8. 남아있는 수 가운데 7은 소수이므로 오른쪽에 7을 쓴다. (노란색)

9. 자기 자신을 제외한 7의 배수를 모두 지운다.

10. 위의 과정을 반복하면 구하는 구간의 모든 소수가 남는다.
図中は11^2 > 120で、11未満の倍数だけ削除すれば十分です.すなわち,120以下の数では,2,3,5,7の倍数を除いて残りは少数である.
*を参照
  • https://ko.wikipedia.org/wiki/%EC%86%8C%EC%88%98_(%EC%88%98%EB%A1%A0)
  • https://ko.wikipedia.org/wiki/%EC%97%90%EB%9D%BC%ED%86%A0%EC%8A%A4%ED%85%8C%EB%84%A4%EC%8A%A4%EC%9D%98_%EC%B2%B4