您的位置:首页 > 其它

7.24 素数总结

2014-02-15 15:34 316 查看
 

判断素数:

第一种方法用于小数据。

 

1 int k=0;
2 int isprime(int num)
3 {
4      int i, j;
5      j = sqrt(num);
6      for (i = 2; i <= j; i++)
7           if (num%i == 0)
8             return 0;
9      return 1;
10 }


 

第二种素数筛选:

用于大数据,数据很小的话就用第一种吧

 1  建立一个全1的数组(下标2~N),
 2  先将下标是2的倍数的全置0,再将下标是3的倍数全置0,……,以此类推,
 3  最后剩下的,仍是1的那些下标,就肯定是素数了。
 

1 #include <stdio.h>
2 #include <string.h>
3 #include <math.h>
4
5 #define N   100000
6 #define yes '1'
7 #define no  '0'
8 char flag[N+1];
9
10 void is_prime(int n)
11 {
12     int i, j;
13     memset(flag, yes, sizeof(flag));
14     flag[0]=flag[1]=no;
15     int len=sqrt(n)+1;
16     for(i=2; i<len; i++)
17     {
18         if(flag[i]==no) continue;
19         for(j=i+i; j<=n; j+=i)
20             flag[j]=no;
21     }
22 }
23
24 int main(void)
25 {
26     int n;
27     ///find the primes from 1 to n(n<=N)
28     scanf("%d", &n);
29     is_prime(n);
30     for(int i=1; i<=n; i++)
31         if(flag[i]==yes)
32             printf("%8d", i);
33     printf("\n");
34     return 0;
35 }


 

素数打表:

 

 

1 #define N   1000001
2 #define yes '1'
3 #define no  '0'
4 char flag
;
5 int p[80000];
6 void is_prime()
7 {
8     int i, j ;
9     memset(flag, yes, sizeof(flag));
10     flag[0]=flag[1]=no;
11     int len=sqrt(N)+1;
12     for(i=2; i<len; i++)
13     {
14         if(flag[i]==no) continue;
15         for(j=i+i; j<=N; j+=i)
16             flag[j]=no;
17     }
18
19     for (i=2;i<=N;i++)
20         if (flag[i]==yes)
21         {
22             T++;
23             p[T]=i;
24         }
25 }


 

总结 : 对于素数的题目,几乎都会用到前面三种。但素数表还是自己写吧。背下来的迟早会忘。至少要自己写的出来。

 

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: