多くの問題がありました、私はそれらを説明しようとします
- プライムチェックの問題は、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];
}
}
お役に立てれば。