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

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

  • 素数打表
 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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值