学习了一天,总结一下,虽然还没完全理解。 = =
- 素数打表
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