0

我想写一个非常简单的主要应用程序。但是我对下面的代码有一些问题,它应该生成从 0 到 99 的素数。但它只显示 99。

一个问题是只显示最后一个数字。但另一个是主要的“检查”不起作用。我该如何解决这些问题。

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

您应该将数字附加到 primetext.text 而不是分配。现在它在每次迭代中都被重新分配。

于 2012-07-23T19:08:16.767 回答
2

有很多问题,我会尽力解释

  • 素数检查的问题在于,您在 for 循环内有 if-else 语句,该语句遍历要检查的数字。因此,如果您的数字不能被您检查的任何数字整除,它将被注册为素数。它也将被注册 n 次,其中 n 是发现它不可整除的次数。
  • 所有偶数都不是素数(除了 2),所以你可以i+=2加倍速度
  • 你只需要检查一个数字的平方根,看看它是否是素数。
  • 1 不是质数,因此您不需要包含它(特别是因为它可以使您的逻辑更复杂)。
  • 您正在重新分配字符串而不是向其添加组件
  • 您使用的是 %i 而不是 %d。这有时会导致奇怪的错误。

考虑到这些要点,这是您修改的方法。

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 回答