我正在尝试使用Sieve of Eratosthenes算法,该算法用于生成指定数字“n”的素数,然后在互联网上遇到代码:
#include <stdio.h>
#define LIMIT 1500000 /*size of integers array*/
#define PRIMES 100000 /*size of primes array*/
int main(){
int i,j,numbers[LIMIT];
int primes[PRIMES];
/*fill the array with natural numbers*/
for (i=0;i<LIMIT;i++){
numbers[i]=i+2;
}
/*sieve the non-primes*/
for (i=0;i<LIMIT;i++){
if (numbers[i]!=-1){
for (j=2*numbers[i]-2;j<limit;j+=numbers[i])
numbers[j]=-1;
/* An alternate can be: for(j=i+numbers[i]; j<20; j+=arr[i])*/
}
}
/*transfer the primes to their own array*/
j = 0;
for (i=0;i<LIMIT&&j<PRIMES;i++)
if (numbers[i]!=-1)
primes[j++] = numbers[i];
/*print*/
for (i=0;i<PRIMES;i++)
printf("%d\n",primes[i]);
return 0;
}
无法理解我试图使用GDB跟踪它的筛选部分的内部for循环,看看输出显示for (j=2*numbers[i]-2;j<limit;j+=numbers[i])
但是它变得困难。
善良的人可以:
a)帮助我理解这个陈述? (J = 2 *号[Ⅰ] -2;Ĵ
b)GDB是否可以并行显示所有堆栈内容 作为执行输出?使用断点并使用
print var
看起来 难。我的意思是我应该在一个断点或数字[i],j 更好的更详细的输出?
答案 0 :(得分:1)
for (i=0;i<LIMIT;i++){
numbers[i]=i+2;
}
号码n
进入广告位n - 2
(n >= 2
)。
for (j=2*numbers[i]-2;j<limit;j+=numbers[i])
请注意,numbers[i]
为n = i+2
,因此2*numbers[i] - 2 = 2*(i+2) - 2
是2*n
的广告位。
numbers[j]=-1;
对于n
的所有倍数,从2*n
开始,将数字标记为复合数。 (这是一个糟糕的筛子,使用了太多的记忆,做了太多的工作。)
Examining the stack
backtrace
where
Show call stack.
backtrace full
where full
Show call stack, also print the local va-
riables in each frame.
frame <frame#>
Select the stack frame to operate on.
可能有助于检查gdb中的堆栈。