3

与えられた数の約数を見つけるために、このコードを書きました。私が実装しようとしている方法は、すべての素因数を見つけ(これは機能します)、同様の素数の数に1を加えた数(除数の数を与えます)を取ります。

例 28 = 2*2 * 7 --> (2+1)*(1+1) = 6

これは私の試みです:

int num = 20;
int next = 0;
int exponent = 0;
int numberOfDivisors = 1;

    start:
        for (int i = 2; i <= num; i++)
        {
            next = i;

            if (num%i == 0)
            {   
                if (i == next)
                {
                    exponent++; 
                }
                else
                {
                    numberOfDivisors *= (exponent+1);
                    exponent = 0;
                }

                if (num != i)
                {
                    num /= i;
                    goto start;
                }
            }
        }

    std::cout << numberOfDivisors << std::endl;

何が欠けているのかわかりません。

4

3 に答える 3

6

コメントからわかるように、gotoの使用は良くありません。少しクリーンアップした後、コードは次のようになります。

#include <iostream>
int main() {
  int num = 20; 
  int numberOfDivisors = 1;

  for (int i = 2; i <= num; i++)
  {
    int exponent = 0;
    while (num % i == 0) {
        exponent++; 
        num /= i;
    }   
    numberOfDivisors *= (exponent+1);
  }

  std::cout << numberOfDivisors << std::endl;
  return 0;
}
于 2012-12-23T01:38:19.557 に答える
1

goto実際には役に立ちません。すでに下の素因数がチェックされているので、元にi戻す必要はありません2

    int numberOfDivisors = 1;
    int exponent = 1;
    int i = 2;
    while (i <= num) {
        if (num%i == 0) {   
            exponent++; 
            num /= i;
        }
        else {
            numberOfDivisors *= exponent;
            exponent = 1;
            i++;
        }
    }
    numberOfDivisors *= exponent; // <-- you were missing this, mainly

スタイルやパフォーマンスに関係のないコードの実際の問題は、ループがexponent含まれていないもので終了したことです。

于 2012-12-23T01:36:56.623 に答える
1

コードには多くの問題があります (gotoループを中断するのは醜いだけです) が、コードの大きな問題の 1 つは、ループに入った直後にと同じ値をfor設定することです。nexti

次に、何かをテストします (つまり、ifが均等にi分割されますnumが、これは重要ではありません) and (ここが重要な部分です。iが と等しいかどうかをテストしnext、それらを等しく設定するだけです。

したがって、コードにelseは、対応する の部分を入力する機会ifがありません。これは、除数を で乗算する場所ですexponent + 1

その結果、コードは常に を出力しますが1、これは望んだものではありません。

PS: それ以外は、デッドコードの除去の一環としてコンパイラによって完全に最適化される可能性があります。これは、最適化以上を有効にした場合に gcc 4.7 が実際に行うこと-O1です。

于 2012-12-23T02:04:15.953 に答える