【发布时间】:2022-01-24 23:03:16
【问题描述】:
这是打印素数的代码。
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
int main()
{
int p;
int i;
int primes[50] = { 0 };
int primeIndex = 2;
bool isPrime;
// hardcode prime numbers
primes[0] = 2;
primes[1] = 3;
for (p = 5; p <= 100; p = p + 2) {
isPrime = true;
for (i = 1; isPrime && p / primes[i] >= primes[i]; ++i)
if (p % primes[i] == 0)
isPrime = false;
if (isPrime == true) {
primes[primeIndex] = p;
++primeIndex;
}
}
for (i = 0; i < primeIndex; ++i)
printf ("%i ", primes[i]);
printf("\n");
return 0;
}
这段代码有几处我不明白:
内部for循环中的条件如何工作以及isPrime变量的用途是什么?
【问题讨论】:
-
布尔值是在找到第一个除数时终止循环。如果候选人被证明不是素数,那么找到另一个除数就没有意义了。另一个条件
p / primes[i] >= primes[i]是防止它迭代超出候选的平方根。为什么?假设p是15。我们会发现3是一个除数,所以继续测试5是没有意义的。 -
硬编码 2 是有意义的,因此
p可以以 2 为步长递增(仅尝试奇数)并以i=1开头因此是有意义的,因为无需测试 2 是否为除数。硬编码 3 对我来说没有意义。顺便说一句,这个问题讨论了完全相同的代码:stackoverflow.com/questions/69764736/… -
使用牙套——它可以防止你被裤子夹住