Chinaunix首页 | 论坛 | 博客
  • 博客访问: 428809
  • 博文数量: 184
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 594
  • 用 户 组: 普通用户
  • 注册时间: 2013-12-17 16:24
个人简介

我是一只小小鸟

文章分类

全部博文(184)

文章存档

2016年(1)

2015年(55)

2014年(127)

2013年(1)

分类: C/C++

2014-05-04 10:29:33

素数算法
    1.求素数的方法中最简单的一种就是除以它之前的所有数(从2开始),如果都不能整除,
它就是一个素数。这个是根据素数的定义求解的,只能被1和它本身整除。
      但显然这样的效率是不高的,如果要求1-100内的素数,对每一个数除以之前所有的数,有很多优化的余地。比如除以素数就可以了,没必要去除以合数,于是加一个表,把之前的结果存储下来,利用空间换取时间。
对于素数的判定,其实只需要判定是否能被 sqrt(n) 以内的素数整除。
2. 感性上讲,对于n,要么是质数,只能被1和自己整除,要么能分解质因数,至少有两个素数因子。        n=p..q;因为不可能p和q都大于sqrt(n)(否则乘积就大于n了),所以只需要判断那个小的素数能不能被n整除就可以了。
      这样,把求素数的算法又提高了一步,不过计算中大量的用到除法,除法效率一般比较低。
3. 有一种筛法求素数的算法,把1-n排成一排,从2开始,2的倍数肯定不是素数,去除,剩下的数中下一个是3.再把3的倍数去除,再下一个是5(4已经去除了),以此类推,最后剩下的数必然是素数,因为它没有被筛,不是任何一个数的倍数(除了1和自己)。这样只需要很多次加法就可以了。
例prime.c

点击(此处)折叠或打开

  1. #include<stdio.h>
  2. #include<math.h>

  3. void prime(int n)
  4. {
  5.     int i=2;
  6.     while((n%i)!=0&&i*1.0<sqrt(n)) i++;
  7.     if(i*1.0>sqrt(n))
  8.          printf("%d is a prime.\n",n);
  9.     else
  10.          printf("%d isn't a prime.\n",n);
  11. }

  12. int main(void)
  13. {

  14.    int a;
  15.    printf("Please input a number :\n");
  16.    scanf("%d",&a);
  17.    prime(a);
  18.    return 0;
  19. }
输出:
gcc直接编译时会报错(sqrt函数未找到):
#gcc prime.c -o prime
/tmp/ccxA2pag.o: In function `prime':
prime.c:(.text+0x49): undefined reference to `sqrt'
prime.c:(.text+0x69): undefined reference to `sqrt'
collect2: ld returned 1 exit status
#man sqrt
......
#include

       double sqrt(double x);
       float sqrtf(float x);
       long double sqrtl(long double x);

       Link with -lm.
......
所以使用sqrt函数的文件中,要实现正常编译,需要在gcc编译时加上-lm即可。
[root@test7 c]# gcc -lm prime.c -o prime
[root@test7 c]# ./prime
Please input a number :
12
12 isn't a prime.
[root@test7 c]# ./prime
Please input a number :
13
13 is a prime.
阅读(844) | 评论(0) | 转发(0) |
0

上一篇:vs2010程序编译问题

下一篇:用户与用户组

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