当我的范围上限大于等于17660的时候,运行报错,不知道哪里有问题。。。
是VC对数组的大小有要求吗?
附源码:
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <time.h>
#include <conio.h>
unsigned int *list; /*已发现的素数列表,为了保证输出表单的格式对齐,弃用前两个存储单元*/
unsigned int *prim;//已知的素数,将被输出至文件
/*计算min与max之间的数字是否为素数*/
unsigned int count=0;
int cal(unsigned int min,unsigned int max)
{
unsigned int i,j,r,s,t,cur,num; /*cur用以存储当前素数表的追加位置,s存储偏移量,t存储是否完成了跳跃,num存储素数表需要列出的素数个数,其它为临时变量*/
double a=clock(),b;/*统计耗时*/
unsigned int size=1024;
s=cur=2;t=0;
num=(int)sqrt((double)max);/*素数表只需要列到最大值的开平方就行*/
list=(unsigned int*)realloc(list,sizeof(int)*size);
prim=(unsigned int*)realloc(prim,sizeof(int)*size);
printf("%u到%u之间的素数有:\r\n",min,max);
i=5;/*跳过2,3的及其倍数校验*/
if(min<3)
{
if(max>=3)
{
printf("23");
prim[0]=2;
prim[1]=3;
count+=2;
}
else if(max==2)
{
printf("2");
prim[0]=2;
count++;
}
}
else if(min==3)
{
printf("3");
prim[0]=3;
count++;
}
while(i<=max)
{/*先完善素数表,并顺便枚举范围内的素数*/
r=1;
for(j=2;j<=num;j++)
{/*对于新的数字用已有的素数校验*/
if(j<cur)
{/*尚未完成素数表的遍历*/
if(i%list[j]==0)
{/*一旦能被整除,则不再向后判断,认定该数不是素数*/
r=0;
break;
}
}
}
if(r)
{/*输出新发现的素数*/
if(cur<=num)
{/*素数表尚不完整*/
if(cur>=size)
{/*当素数表空间不足时,动态扩展*/
size+=1024;
list=(unsigned int*)realloc(list,sizeof(int)*size);
}
if(count>=size)
{
prim=(unsigned int*)realloc(prim,sizeof(int)*(size+1024));
}
list[cur++]=i;
}
if(min<=i)
{/*当前的素数在求取范围内*/
printf("%u",i);
prim[count++]=i;
(count%5==0)?printf("\r\n"):printf("");/*每输出5个数字进行一次换行*/
}
else if(t==0&&i>num)
{/*当素数表就绪,但当前运算的数小于最小要求取的数时,进行跳跃*/
switch(min%6)
{/*判断min与2,3的公倍数的关系,据此决定跳跃幅度*/
case 1:
s=4;
I
是VC对数组的大小有要求吗?
附源码:
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <time.h>
#include <conio.h>
unsigned int *list; /*已发现的素数列表,为了保证输出表单的格式对齐,弃用前两个存储单元*/
unsigned int *prim;//已知的素数,将被输出至文件
/*计算min与max之间的数字是否为素数*/
unsigned int count=0;
int cal(unsigned int min,unsigned int max)
{
unsigned int i,j,r,s,t,cur,num; /*cur用以存储当前素数表的追加位置,s存储偏移量,t存储是否完成了跳跃,num存储素数表需要列出的素数个数,其它为临时变量*/
double a=clock(),b;/*统计耗时*/
unsigned int size=1024;
s=cur=2;t=0;
num=(int)sqrt((double)max);/*素数表只需要列到最大值的开平方就行*/
list=(unsigned int*)realloc(list,sizeof(int)*size);
prim=(unsigned int*)realloc(prim,sizeof(int)*size);
printf("%u到%u之间的素数有:\r\n",min,max);
i=5;/*跳过2,3的及其倍数校验*/
if(min<3)
{
if(max>=3)
{
printf("23");
prim[0]=2;
prim[1]=3;
count+=2;
}
else if(max==2)
{
printf("2");
prim[0]=2;
count++;
}
}
else if(min==3)
{
printf("3");
prim[0]=3;
count++;
}
while(i<=max)
{/*先完善素数表,并顺便枚举范围内的素数*/
r=1;
for(j=2;j<=num;j++)
{/*对于新的数字用已有的素数校验*/
if(j<cur)
{/*尚未完成素数表的遍历*/
if(i%list[j]==0)
{/*一旦能被整除,则不再向后判断,认定该数不是素数*/
r=0;
break;
}
}
}
if(r)
{/*输出新发现的素数*/
if(cur<=num)
{/*素数表尚不完整*/
if(cur>=size)
{/*当素数表空间不足时,动态扩展*/
size+=1024;
list=(unsigned int*)realloc(list,sizeof(int)*size);
}
if(count>=size)
{
prim=(unsigned int*)realloc(prim,sizeof(int)*(size+1024));
}
list[cur++]=i;
}
if(min<=i)
{/*当前的素数在求取范围内*/
printf("%u",i);
prim[count++]=i;
(count%5==0)?printf("\r\n"):printf("");/*每输出5个数字进行一次换行*/
}
else if(t==0&&i>num)
{/*当素数表就绪,但当前运算的数小于最小要求取的数时,进行跳跃*/
switch(min%6)
{/*判断min与2,3的公倍数的关系,据此决定跳跃幅度*/
case 1:
s=4;
I
