没有作什么溢处判断.比如n 超过int 最大值,数组长度小于 len等.作为素数条件
1.素数一定是奇数 :)
2.素数只能整除1和他自己
3.奇数如果不能整除比他小的素数,则为素数。这个范围可以更小,就是除到比这个数开方小的素数即可
如果都不能整除则此数为素数。当然不能在程序里面做开方运算,速度太慢。换作 n < array[j] * array[j]
相对乘法比开方除法快
//保证array 开辟区间比len大
void prime(int* array,int len)
{
array[0] = 2; //数组至少有一个空间
int n = 3;
for(int i=1;i<len;i++) //从第二个素数开始
{
for(int j=0;j<i;j++)
{
if(n%array[j] == 0)
{
n += 2; //奇数作为素数的侯选者
j=0;
continue;
}
if(n < array[j] * array[j]) //如果汇编的话一次除法可以的到商和余数,但c里面只能一次一个。用乘法取代除
break;
}
array[i] = n;
n += 2;
}
}
下面是简单求一个偶数拆成两个素数的程序:
int a,b,c,d;
int temp;
scanf("%d",&a);
for(b=3;b<=a/2;b+=2)
{
temp = sqrt((float)b);
for(c=2;c<=temp;c++)
{
if(b%c==0)
{
break;
}
}
if(c>temp)
d=a-b;
else
break;
temp = sqrt((float)d);
for(c=2;c<=temp;c++)
{
if(d%c==0)
{
break;
}
}
if(c>temp)
printf("%d=%d+%d/n",a,b,d);
}