0

以下程序确定主要变量。对于大于 1 且小于 p 的所有 d 值返回余数 (p%d) 的值将 isPrime 的值设置为“1”。

- (int)someMethod
{
    @autoreleasepool {

        int isPrime;
        for (int p = 2; p <= 50; ++p) {
            isPrime = 1;

            for (int d = 2; d < p; ++d) {

                if ( p % d == 0)
                    isPrime = 0;

                if ( isPrime != 0)
                    NSLog (@"%i ", p);
            }
        }
    }

    return 0;
}

我的问题是,为什么第一个“for”语句在递增“1”后立即进行,而在第二个“for”语句中,循环继续进行,直到 d 的值不再小于 p,然后再进入最后一个“if”语句和 NSLog。

如果这个问题不清楚,例如,如果 p 的值为 14,则程序执行如下:

  1. p 将增加 1 变为 15
  2. 变量 isPrime 将被设置为 1
  3. d 的值将设置为 2
  4. p%d 将被计算,
  5. 结果将不等于 0,因此将跳过 for 语句
  6. 那么由于某种我不明白的原因,d 的值将增加到 3,并且循环将继续直到 d 等于 15,而不是简单地转到 if 语句和 NSLog,它将显示“15 ”。为什么第二个“for”循环继续在“if”语句中循环,增加 d,而第一个循环增加一次 p 然后继续?
4

3 回答 3

2

他理解for循环。其他答案似乎无法理解这个问题。这个循环根本不能正确确定素数。例如,当它们不是素数时,它会打印出 15 和 49 作为素数。因为它在内部循环中打印,所以它也会多次打印素数。它应该打印出 15,你的逻辑是合理的。我不知道为什么它不适合你,但它适合我。正确的实现应该是:

- (int)someMethod {
    int isPrime;
    for (int p = 2; p <= 50; ++p) {
        isPrime = 1;
        for (int d = 2; d < p; ++d) {
            if ( p % d == 0)
                isPrime = 0;
        }
        if (isPrime)
            NSLog (@"%i ", p);
    }
    return 0;
}

我会解释为什么它不起作用。

要确定一个数是否为素数,该程序应查看是否有任何数均分p。一旦找到一个,这个数字就不再是素数,它应该设置isPrime0。一旦它检查了每个小于 的数字p,并因此确定isPrime,它应该检查isPrime它是否应该打印出这个数字。但是,它isPrime每次检查一个数字是否均分到p. 由于isPrime在开始时对于 的每个值都设置为 1,因此p打印出任何不能被 2 整除的数字。它检查 2 是否均分,它没有,它立即检查isPrime这是 1,并立即将其打印出来,就好像它是素数一样;但是,如果 AFTER 2 之后的数字均分为该数字怎么办?这就是为什么 15 和 49 当它们是合数时被打印为素数。

于 2012-09-03T03:01:42.330 回答
0

我不明白你不清楚的地方。

问题:找出如果p是素数

p是素数,如果它没有任何因素d <= pp%d == 0除了1p本身。内部 for 必须遍历所有小于 的数字p,以确保其中没有一个是 的因数p

请注意,这个实现是微不足道的,而且效率低下,它做了素数的隐含定义。

唯一可能让您感到困惑的是,当找到一个因素时,内部循环不会中断,例如。

if ( p % d == 0)
{
  isPrime = 0;
  NSLog("number is not prime!);
  break;
}
于 2012-09-03T00:48:20.067 回答
0

“我的问题是,为什么第一个“for”语句在递增“1”后立即进行,而在第二个“for”语句中,循环继续进行,直到 d 的值不再小于 p,然后再继续最终的“if”语句和 NSLog。”

您似乎对 for 循环的工作原理有点困惑。

// Outer loop will run 1 time
for (int i = 0; i < 1; i++) {
    NSLog(@"Outer loop = %d", i);

    // Innter loop will run 10 times
    for (int j = 0; j < 10; j++) {
        NSLog(@"Inner loop = %d", j);
    }
}

上面的循环打印出以下输出:

Outer loop = 0
Inner loop = 0
Inner loop = 1
Inner loop = 2
Inner loop = 3
Inner loop = 4
Inner loop = 5
Inner loop = 6
Inner loop = 7
Inner loop = 8
Inner loop = 9

编辑:

- (int)isPrime
{
    @autoreleasepool {

        // Outer loop will run once to check if 15 is prime
        for (int p = 15; p <= 15; ++p) {

            // You set isPrime to 1
            int isPrime = 1;

            // Inner loop will start at 2 and run until 14, there is no
            // need to check if 15 % 1 or 15 % 15 because a prime number is
            // divisible by itself or 1
            for (int d = 2; d < p; ++d) {

                NSLog(@"%d mod %d", p, d);

                // The first run through of the inner loop, you check if
                // 15 % 2, this is not true, so you skip to the next loop.
                if (p % d == 0) {
                    isPrime = 0;
                    //break;  // This is optional because at this point, you know p is not prime
                }

                // Remember you set isPrime to 1, so the loop checks if isPrime != 0
                // This statement is true, so you print p which at this point is 15.
                if (isPrime != 0) {
                    NSLog (@"%i ", p);
                }

                // On the next run through of the inner loop, 15 % 3 is equal to
                // 0, so you set isPrime to 0, and for the rest of the inner loop
                // isPrime is equal to 0, it can not change, this is why p is never
                // printed out again
            }
        }
    }

    return 0;
}

我在内循环中添加了一条日志语句。继续运行我的代码,这样你就可以看到发生了什么。我会这么说,你的代码看起来不错。如果 isPrime 等于 0,您知道 p 是否为素数,因此添加一个 break 语句将是一个好主意。检查代码以查看放置它的位置。

于 2012-09-03T00:53:21.000 回答