读书人

孪生素数有关问题

发布时间: 2012-04-05 12:42:39 作者: rapoo

孪生素数问题
#include<stdio.h>
#define L1000000
bool a[L]={1,1};
short int b[L]={0,0,0,1};
int main()
{
int i, j;
printf("%d\n",b[0]);//这个b[0]==0
for(i=2;i<=1001;i++)
for(j=i;j<=L/i;j++)
a[j*i]=1;
printf("%d\n",b[0]);//这个b[0]==1
for(i=4; i<L;i++) b[i]=b[i-1]+!(a[i]||a[i-2]);b[0]=0;
for(scanf("%d", &i); i--; printf("%d\n",b[scanf("%d", &j), j]));
}
中间都没对b进行操作,值为什么能变呢???

[解决办法]
具体c的数据类型不是很清楚,不过大概是这样的:

bool a[L]={1,1}; --内存空间中拉了一块1000,000的区域分配给a
short int b[L]={0,0,0,1}; --内存空间中另外拉了一块1000,000的区域分配给b
-- 当存储空间足够大的时候,内存会直接分配2000,000的区域,其中前1000,000是给a的,后1000,000是给b的,这种连续分配是导致b[0]被改的关键。

for(i=2;i<=1001;i++)
for(j=i;j<=L/i;j++)
a[j*i]=1;
当i=1000时,j的范围是从1000~1000的,此时执行的a[j*i]=1翻译过来是
a[1000,000]=1
注意!c中的数组下标是从0开始的,也就是说,一开始的a其实是从a[0]到a[999,999],
那么a[1000,000]其实就已经越界到b[0]上了!
c的运行期环境没有数组越界控制,所以LZ没有发现这个bug。

读书人网 >软件架构设计

热点推荐