小数を求めるアルゴリズム
11076 ワード
小数を求めるアルゴリズム
bool solution1(int x)
{
if (x < 2) { // 0, 1은 소수가 아님
return false;
}
for (int i = 2; i < x; ++i) {
if (x % i == 0) {
return false;
}
}
return true;
}
2から自分より小さい数まで、1つずつx % i
を作り、残りの0は小数ではなく、残りは0ではなく小数です.誰もが探索しているので、数が多ければ長い時間がかかるのが欠点です.以上の方法は、
i < x
をi < x / 2
に変更した.例えば、18が少数でない場合、薬水は
1 2 3 6 9 18
であり、そのうち1および18を除く.2 3 6 9
.1以外にも数があるので、x / 2
まで検索しても大丈夫です.bool solution2(int x)
{
if (x < 2) { // 0, 1은 소수가 아님
return false;
}
for (int i = 2; i < x / 2; ++i) {
if (x % i == 0) {
return false;
}
}
return true;
}
上記の100という数字の約数を考えてみましょう
1 2 4 5 10 20 25 100
ここでは1と100を除いて、考えてみましょう.2 4 5 10 20 25 100
.薬水はこのように2 * 50 = 100
4 * 25 = 100
のようなa * b = x
からなるので、sqrt(x)
に分けても少数ではないか判断できます.aとbはxの平方根以下でなければならないからである.xが10000であれば、100回検索すればいいだけで、数字が大きいほど検索時間が大幅に減少します.
注意すべきは、このような状況でそうすべきだということです.
上記のように
i <= sqrt(x)
をすると、25か9の場合、少数ではないと思われます.bool solution3(int x)
{
if (x < 2) {
return false;
}
for (int i = 2; i <= sqrt(x); ++i) {
if (x % i == 0) {
return false;
}
}
return true;
}
i < sqrt(x)
の代わりにi <= sqrt(x)
を使ってもいいです.しかし、i * i <= sqrt
の欠点は、i * i
ゲートを回転するごとにfor
を計算することである.これは有名な素数を求めるアルゴリズムです.上記の3つの方法よりずっと速くて、実現しにくいわけではありません.
以上の場合、120までの小数を探すので、sqrt(120)を除いて11の倍数で十分です.
bool primeArray[MAX]; // MAX 구하고자 하는 수의 최댓값
void initPrime(int n)
{
fill(bool, bool + n, true); // 처음엔 모두 소수로 본다.
for (int i = 2; i * i <= n; ++i) {
if (primeArray[i]) {
for (int j = i * i;j <= n; j += 1) {
primeArray[j] = false;
}
}
}
}
bool solution4(int x)
{
if (x < 2) {
return false;
}
initPrime(1000000);
return primeArray[x];
}
アルゴリズムの問題を解くときに小数点を探す必要があるなら、エラトネスのふるいを使いましょう.Reference
この問題について(小数を求めるアルゴリズム), 我々は、より多くの情報をここで見つけました https://velog.io/@gkscodus11/소수-구하기-알고리즘テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol