小数を求めるアルゴリズム


小数を求めるアルゴリズム

  • 基本方法
  • 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ではなく小数です.誰もが探索しているので、数が多ければ長い時間がかかるのが欠点です.
  • さらに改良された方法-1
    以上の方法は、i < xi < 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 = 1004 * 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つの方法よりずっと速くて、実現しにくいわけではありません.
  • クリエイティブ
  • 2から、小数を要求したいすべての数をリストします.(アレイ別)
  • 自分以外の2の倍数をクリアします.
  • グリッドを移動し、クリアできない場合は、その数のすべての倍数を削除します.
  • 消去されていない数は少数です.
  • 以上の考えを図に示す.ソース:ウィキペディア

    以上の場合、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];
    }
    アルゴリズムの問題を解くときに小数点を探す必要があるなら、エラトネスのふるいを使いましょう.