【问题标题】:for loop/if statements in Objective-C(simple)Objective-C 中的 for loop/if 语句(简单)
【发布时间】:2012-09-03 00:21:29
【问题描述】:

以下程序确定主要变量。对于大于 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 然后继续?

【问题讨论】:

  • 尝试清理帖子的格式。
  • 清理代码,更容易修复!
  • 您确定输入正确吗?错误放置的支架导致了一个非常严重的错误。内部for 循环的右括号} 应该紧跟在if( p % d == 0 ){ isPrime = 0; } 之后,而不是在第二个if 块之后。

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


【解决方案1】:

他了解 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 以查看是否应该打印出该数字。但是,它每次检查一个数字是否均分到p 时都会检查isPrime。由于isPrime 在开始时对于p 的每个值都设置为1,因此打印出任何不能被2 整除的数字。它检查 2 是否均分,它没有,它立即检查 isPrime 是否为 1,并立即将其打印出来,就好像它是素数一样;但是,如果 AFTER 2 之后的数字均分为该数字怎么办?这就是为什么 15 和 49 在复合时打印为素数。

【讨论】:

  • 你完全理解我的问题。我直接从Learning Objective-C by Stephen Kochan 中解决了这个问题,我相信我正确地复制了它(不知道如何查看我的原始未编辑帖子),它并不意味着包含错误,因为它是一个示例,我什至从未费心实际运行该程序。我应该意识到出了点问题,因为大括号的数量不正确,这导致了错误。非常感谢!
【解决方案2】:

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

问题:判断p是否为素数

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

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

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

if ( p % d == 0)
{
  isPrime = 0;
  NSLog("number is not prime!);
  break;
}

【讨论】:

  • 如果 p 的值为 15,那么当我们到达第一个 if 语句时,15%2 的余数不等于 0,因此我们将跳过该 if 语句并转到下一条if语句和isPrime的值将不等于0,提示NSLog显示,那为什么15不显示呢?
【解决方案3】:

“我的问题是,为什么第一个“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 语句将是一个好主意。检查代码以查看放置位置。

【讨论】:

  • 我想我不明白 for 语句是如何工作的。如果 p 的值是 15,那么当我们到达第一个 if 语句时,15%2 的余数不等于 0,所以我们将跳过该 if 语句并转到下一个 if 语句,并且isPrime 会不等于 0,提示 NSLog 显示,那为什么 15 不显示呢?
  • @Ronald 检查编辑,我还添加了一个链接,也许对你有帮助
  • 感谢您的编辑和链接,这是您的“可能”声明,我仍然不明白,我了解必须发生的事情,而不是实际发生的情况。不清楚为什么,当第一个 if 语句确定 15%2 不等于 0 时,值 15 不会移动到第二个 if 语句,从而显示值 15。这个程序将与 break 语句完美结合.我想我一定忘记了一些关于 if 语句如何工作/继续的事情,我想我会睡在上面,然后重新阅读我明天正在阅读的书的那一章。再次感谢您的帮助!
  • My book 因某种原因缺少大括号,我现在完全明白了,感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 2013-09-02
  • 2018-04-16
  • 1970-01-01
  • 2021-07-31
  • 1970-01-01
  • 2016-04-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多