轻松求素数

来源:互联网 发布:罗素文集 知乎 编辑:程序博客网 时间:2024/04/27 08:32

没有作什么溢处判断.比如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);
    }

原创粉丝点击