Objective-C中的for循环/ if语句(简单)

时间:2012-09-03 00:21:30

标签: objective-c loops if-statement for-loop

以下程序确定主要变量。对于d大于1且小于p的所有值,返回余数(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;
}

我的问题是,为什么第一个&#34; for&#34;声明在递增后立即进行,并且#34; 1&#34;而在第二个&#34; for&#34;声明,循环继续进行直到d的值不再小于p,然后才转到最终的&#34;如果&#34;声明和NSLog。

如果这个问题不明确,例如,如果p的值为14,则程序按如下方式进行:

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

3 个答案:

答案 0 :(得分: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。一旦找到一个,该数字就不再是素数,并且应该将isPrime设置为0。一旦检查了每个小于p的数字,并确定isPrime,它应该检查isPrime以查看是否应该打印出该数字。但是,它会在每次检查isPrime时检查一个数字是否均匀分配到p。由于isPrime在开始时为p的每个值设置为1,因此任何不能被2整除的数字都会打印出来。它会检查2是否均匀分割,但不会立即检查isPrime是否为1,然后立即将其打印出来,就好像它是素数一样;但如果AFTER 2后面的数字均匀分配到那个数字怎么办?这就是15和49在复合时打印为素数的原因。

答案 1 :(得分:0)

我不明白你不清楚的事。

问题:查找p是否为素数

p如果没有任何因素d <= p,则p%d == 01pp本身除外。内部for必须遍历所有小于p的数字,以确保它们中的任何一个都不是if ( p % d == 0) { isPrime = 0; NSLog("number is not prime!); break; } 的因子。

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

唯一可能让您感到困惑的事情是,当找到一个因子时,内环不会被中断,例如

{{1}}

答案 2 :(得分: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语句是个好主意。检查代码以查看放置它的位置。