沒有作什麼溢處判斷.比如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);
}