Chinaunix首页 | 论坛 | 博客
  • 博客访问: 354842
  • 博文数量: 213
  • 博客积分: 566
  • 博客等级: 中士
  • 技术积分: 1210
  • 用 户 组: 普通用户
  • 注册时间: 2011-03-21 13:09
文章分类

全部博文(213)

文章存档

2015年(1)

2013年(7)

2012年(128)

2011年(77)

分类:

2011-03-25 17:05:39

原文地址:筛法求素数 作者:chengxiaopeng

用筛法求100之内的素数。
筛法:先把N个自然数按次序排列起来。1不是质数,也不是合数,要划去。第二个数2是质数留下来,而把2后面所有能被2整除的数都划去。2后面第一个没划去的数是3,把3留下,再把3后面所有能被3整除的数都划去。3后面第一个没划去的数是5,把5留下,再把5后面所有能被5整除的数都划去。c这样一直做下去,就会把不超过N的全部合数都筛掉,留下的就是不超过N的全部质数。因为希腊人是把数写在涂腊的板上,每要划去一个数,就在上面记以小点,寻求质数的工作完毕后,这许多小点就像一个筛子,所以就把埃拉托斯特尼的方法叫做“埃拉托斯特尼筛法”,简称“筛法”。(另一种解释是当时的数写在纸草上,每要划去一个数,就把这个数挖去,寻求质数的工作完毕后,这许多小洞就像一个筛子。)
根据原理写出如下代码:

#include <stdio.h>
#define N 100

int is_zhishu(int);
int main(int argc, int *argv[])
{
    
    int a[N];
    int i = 0,j,k = 0;
    do
    {
      a[i] = i+1;
      i++;
    }while(i < N);
    
    for(i = 0; i < N; i++)
    {
          if (1 == is_zhishu(a[i]))
          {
             for (j = i + 1; j < N; j++)
              {
                  if (0 == a[j])
                  {
                     continue;
                  }
                  else if (0 == a[j] % a[i])
                  {
                     a[j] = 0;
                  }
                  else
                  {
                      ;
                  }
              }
          }
          else
          {
              a[i] = 0;
          }
    }

    for (i = 0; i < N; i++)
    {
        if (0 == a[i])
        {
           continue;
        }
        else
        {
            
            if (k != 0 && 0 == k % 5)
            {
               printf("\n");
            }
            k++;
            printf("%d ",a[i]);
        }
    }
    printf("\nall %d numbers.\n",k);
       
    system("pause");
    return 0;
}

int is_zhishu(int number)
{
    if (number < 1)
    {
       return 0;
    }
    
    if (1 == number)
    {
       return 0;
    }
    
    if (2 == number)
    {
       return 1;
    }
    
    int i,result = 1;
    
    for (i = 2; i < number; i++)
    {
        if (0 == number % i)
        {
           result = 0;
           break;
        }
    }
    return result;
}


我在网上看到了另外一个求素数的算法,不过还有些看不懂。代码如下:

#include <stdio.h>
#define N 100
char num[N+1];
int main(int argc, int *argv[])
{
    unsigned int i=0,j=0;
    num[0]=num[1]=0;
    num[2]=1;
    for (i=3;i<N+1;i+=2)
        num[i]=1;
    for (i=4;i<N+1;i+=2)
        num[i]=0;
    for (i=3;i*i<N+1;i+=2)
        if (num[i])
            for (j=i*i;j<N+1;j+=i+i)
                if (num[j])
                    num[j]=0;
    for (i=0,j=0;i<N+1;i++)
        if (num[i])
        { j++;
            printf("%d\t",i);
        }
    printf("\n%d以内有%d个素数!",i-1,j);
    system("pause");
    return 0;
}


阅读(537) | 评论(0) | 转发(0) |
0

上一篇:C程序练习-冒泡排序

下一篇:判断闰年

给主人留下些什么吧!~~