C 区分两个数组索引?
我的数组有问题。我从一本书中复制了以下代码:C 区分两个数组索引?,c,arrays,primes,C,Arrays,Primes,我的数组有问题。我从一本书中复制了以下代码: #include <stdio.h> #include <stdbool.h> int main (void) { int p, i, primes[50], primeIndex = 2; bool isPrime; primes[0] = 2; primes[1] = 3; for (p = 5; p <= 50; p = p + 2) {
#include <stdio.h>
#include <stdbool.h>
int main (void)
{
int p, i, primes[50], primeIndex = 2;
bool isPrime;
primes[0] = 2;
primes[1] = 3;
for (p = 5; p <= 50; 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;
}
#包括
#包括
内部主(空)
{
int p,i,素数[50],素数指数=2;
bool-isPrime;
素数[0]=2;
素数[1]=3;
对于(p=5;p=primes[i];++i)
如果(p%素数[i]==0)
isPrime=false;
if(isPrime==true){
素数[primeIndex]=p;
++素数指数;
}
}
对于(i=0;i
特别是,我很难理解
primeIndex
和I
变量之间的区别。primeIndex
表示数组编号,i
表示放入数组的编号。对吗?primeIndex
是在prime
数组中写入下一个找到的素数的位置,也是到目前为止已知的素数i
是用于试验划分的素数索引。对于每个候选项,i
从1(我们不需要尝试primes[0]=2
,因为只检查奇数)循环到大于候选项平方根的第一个素数的索引。primeIndex
是在prime
数组中写入下一个找到的素数的位置,还有到目前为止已知的素数i
是用于试验划分的素数索引。对于每个候选项,i
从1(我们不需要尝试primes[0]=2
,因为只检查奇数)循环到大于候选项平方根的第一个质数的索引。有人知道此算法的名称吗?请注意,当您设置isPrime=false代码>,您还可以明智地添加一个中断
(并用大括号{…}
)提前终止循环。更糟糕的是:整个布尔(循环不变量+1/2)isPrime
可以通过goto消除,add-to数组可以压缩为primes[primeIndex++]=p代码>顺便说一句,p@bacchus,它是一个试验部门。只使用找到的素数来避免无意义的除法。有人知道这个算法的名称吗?请注意,当您设置isPrime=false代码>,您还可以明智地添加一个中断
(并用大括号{…}
)提前终止循环。更糟糕的是:整个布尔(循环不变量+1/2)isPrime
可以通过goto消除,add-to数组可以压缩为primes[primeIndex++]=p代码>顺便说一句,p@bacchus,它是一个试验部门。只是用找到的素数来避免无意义的除法。我现在明白了区别。但是看看计算机执行的第一个p数,即5,循环不会终止吗?因为5/3小于3?内部循环,它测试p
是否是素数。然后,由于isPrime
未设置为false,因此将5写入prime
数组中primeIndex
(2),primeIndex
递增,外部循环进入下一轮,将2添加到p
,从而检查7。再次,内部循环立即结束,primes[3]=7
,外部循环使用p=9
…我现在理解了区别。但是看看计算机执行的第一个p数,即5,循环不会终止吗?因为5/3小于3?内部循环,它测试p
是否是素数。然后,由于isPrime
未设置为false,因此将5写入prime
数组中primeIndex
(2),primeIndex
递增,外部循环进入下一轮,将2添加到p
,从而检查7。再次,内部循环立即结束,素数[3]=7
,外部循环为p=9
。。。