素数判断
一.判断一个数是否为素数最简单的方法是试除法
(判断一个整数a是否是素数,只需把 a 用 2 ~ a-1 之间的每一个整数去除,如果都不能被整除,那么 m 就是一个素数。) 时间复杂度O(a)
这个方法可以简化为试除2~sqrt(a)之间所有整数 时间复杂度O(sqrt(a))
完整程序(在vs2017下调试)
#include<stdio.h> #include<math.h> void main() { unsigned long long int a,c,i,f; float b; f = 0; printf("input a number\n"); scanf_s("%d", &a); b = sqrt(a); c = (floor(b)+1); for (i = 2; i < c; i++) if (a%i == 0) { f = 1; break; } if (f == 0) { printf("prime number\n"); } else { printf("composite number\n"); } }
求素数的算法还可以继续优化
1.从3开始之后的所有整数仅需试除奇数 时间复杂度O(sqrt(a)/2)
#include<stdio.h> #include<math.h> void main() { unsigned long long int a, c, i, f; float b; f = 0; printf("input a number\n"); scanf_s("%d", &a); b = sqrt(a); c = (floor(b) + 1); for (i = 3; i < c; i=i+2) //获取2~sqrt(a)的全部奇数 if (a%2 == 0) //先判断2是否为该数的质因子 { f = 1; break; } else if (a%i == 0) //再判断后续奇数是否为该数质因子 { f = 1; break; } if (f == 0) { printf("prime number\n"); } else { printf("composite number\n"); } }
2.易证:大于5的素数全部与6的倍数相邻(证明过程省略)时间复杂度O(sqrt(n)/3)
#include<stdio.h> #include<math.h> void main() { int a, c, i, f; f = 0; printf("input a number\n"); scanf_s("%d", &a); if (a == 2 || a == 3) { f = 0; } if (a % 6 == 1 || a % 6 == 5) { c = (floor(sqrt(a)) + 1); for (i = 3; i < c; i = i + 2) if (a%i == 0) { f = 1; break; } } else { f = 1; } if (f == 0) { printf("prime number\n"); } else { printf("composite number\n"); } }
3.假设某数被判断为素数,那么他的所有倍数全部都是合数,这样就可以筛选掉所有已知素数的倍数
需要注意的是被定义变量的范围:假如使用int定义变量,有效的判断范围就是0—2147483647,超过该范围的值将无法正确判断
二.C程序设计第6章习题1:
用筛选法求100以内的素数
(此处仍然使用了最原始的算法)
#include<stdio.h> #include<math.h> int main() { int m, k, i; printf("100以内的素数\n"); for (m = 1; m <= 100; m++) { k = sqrt(m); for (i = 2; i <= k; i++) if (m%i == 0) break; if (i >= k + 1) { printf("%d\n", m); } } return 0; }

浙公网安备 33010602011771号