0

本当にシンプルなプライムアプリを書きたいです。しかし、私は以下のコードでいくつかの問題を抱えています。0から99までの素数を生成するはずです。しかし、代わりに99を表示します。

1つの問題は、最後の番号だけが表示されることです。しかし、もう1つは、主要な「チェック」が機能しないことです。どうすればこれらの問題を解決できますか。

for (i=0; i<100; i++) {
    for (n=2; n<i; n++) {
        if (i%n == 0) break;
        else primetext.text = [NSString stringWithFormat:@"%i, ", i];
    }
}
4

2 に答える 2

2

多くの問題がありました、私はそれらを説明しようとします

  • プライムチェックの問題は、forループ内にif-elseステートメントがあり、チェックする数値を繰り返すことでした。したがって、あなたの番号がチェックした番号のいずれかで割り切れなかった場合、それは素数として登録されます。また、n回登録されます。ここで、nは、除算できないことが判明した回数です。
  • すべての偶数は素数ではないので(2を除く)、i+=2速度を2倍にすることができます
  • 素数かどうかを確認するには、数値の平方根までチェックする必要があります。
  • 1は素数ではないため、含める必要はありません(特に、ロジックがより複雑になる可能性があるため)。
  • コンポーネントを追加する代わりに、文字列を再割り当てしていました
  • %dの代わりに%iを使用していました。これにより、奇妙なエラーが発生する場合があります。

これらの点を念頭に置いて修正した方法を次に示します。

int maxNum = 100;
primetext.text = @"2 ";             //Start knowing that 2 is the lowest prime (avoid evaluating evens)
for (i=3; i<=maxNum; i+=2)          //Start at 3 and add 2 (avoid 1 and 2 as well as even numbers) 
{
    bool isPrime = YES;             //Assume that i is prime
    for (n=2; n<sqrt(i); n++)       //Divide by every number up to square root
    {
        if (i%n == 0)               //If evenly divisible by n, not a prime
        {
            isPrime = NO;
            break;                  //Don't need to check any more factors, so break
        }
    }
    if (isPrime)                    //If isPrime was never set to NO, i is prime
    {
        NSString *temp = [NSString stringWithFormat:@"%d ", i];
        primetext.text = [primetext.text stringByAppendingString:temp];
    }
}

お役に立てれば。

于 2012-07-23T19:16:35.023 に答える
2

割り当てるのではなく、primetext.textに番号を追加する必要があります。現在、反復ごとに再割り当てされています。

于 2012-07-23T19:08:16.767 に答える