【基础数学】素数判定、素数打表

  学习了一天,总结一下,虽然还没完全理解。 = =

  • 素数打表
 1 //根据《离散数学》上的一个定理想到的,定理为:“若正整数a>1,且a不能被不超过a的平方根的任一素数整除,则a是素数”,

 2 //实现过程如下

 3 #include<cstdio>

 4 #include<cstring>

 5 #include<cmath>

 6 int p[1000000],t=0;

 7 int prime(int n)

 8 {

 9     int i,q;

10     //n的平方根

11     q=(int)sqrt(n);

12 

13     //n不能被不超过n的平方根的任一素数整除

14     for(i = 0;p[i] <= q && t;i++){

15         printf("two\t");

16         if(n % p[i] == 0)return 0;

17     }

18     return 1;

19 }

20 int main()

21 {

22     int n,i;

23     while(scanf("%d",&n) == 1){

24         for(i=2;i<=n;i++){

25             printf("one\t");

26             if(prime(i)) p[t++]=i;

27         }

28         for(i=0;i<t;i++)

29             printf("%d\n",p[i]);

30         //printf("\n");

31         t = 0;

32     }

33     return 0;

34 }

35 //此方法可以对超大量数据的进行打表!

36 //此方法也同样合适于素数打表,但是判定单个时这个方法不可取!

37 //还没完全理解,先挖好坑吧
  • 素数判定
 1 //由上个方法可衍生出此素数判定方法:

 2 #include<stdio.h>

 3 #include<math.h>

 4 int p[8]={4,2,4,2,4,6,2,6};

 5 int prime(int n)

 6 {

 7     int i=7,j,q;

 8     if(n==1)return 0;

 9     if(n==2||n==5||n==3)return 1;

10     if(n%2==0||n%3==0||n%5==0)return 0;

11     q=(int)sqrt(n);

12     for(;i<=q;){

13         for(j=0;j<8;j++){

14             if(n%i==0)return 0;

15             i+=p[j];

16         }

17         if(n%i==0)return 0;

18     }

19     return 1;

20 }

21 void main()

22 {

23     int n;

24     scanf("%d",&n);

25     if(prime(n))puts("Yes");

26     else puts("No");

27 }

28 //这种方法既可以用于最快速地判定单个数,也可以用于判定超大量的数据。

29 //但目前还没理解.....
  • 练习题

   素数打表:   http://arena.acmclub.com/problem.php?id=1840

   素数判定:   http://arena.acmclub.com/problem.php?id=1790

你可能感兴趣的:(基础)