|
首先说明,2147483647是一般环境下的INT_MAX,下面代码用的都是INT_MAX以免打错
第一个很慢的版本,也是最平庸的做法,试除到 n/2- #include <stdio.h>
- #include <limits.h>
- int main()
- {
- int is_prime = 1;
- int div = 2;
- int upper = INT_MAX/2;
- for(; div <= upper; ++div)
- if(INT_MAX % div == 0){
- is_prime = 0;
- break;
- }
- if(is_prime)
- printf("%d is a prime\n", INT_MAX);
- else
- printf("%d is not a prime\n", INT_MAX);
- return 0;
- }
复制代码 用POSIX time在我的机器上测定,耗时6.39s
第二个版本,首先把所有偶数都筛掉- #include <stdio.h>
- #include <limits.h>
- int main()
- {
- int is_prime = 1;
- int div;
- if(INT_MAX % 2 == 0)
- is_prime = 0;
- else
- for(div = 3; div <= INT_MAX/2; div+=2)
- if(INT_MAX % div == 0){
- is_prime = 0;
- break;
- }
- if(is_prime)
- printf("%d is a prime\n", INT_MAX);
- else
- printf("%d is not a prime\n", INT_MAX);
- return 0;
- }
复制代码 不出意料,时间减少了一半,3.20s
第三个版本,也就是6n±1筛法,把2和3的倍数都筛掉,只用检验6n±1- #include <stdio.h>
- #include <limits.h>
- int main()
- {
- int is_prime = 1;
- int div;
- if(INT_MAX % 2 == 0 || INT_MAX % 3 == 0)
- is_prime = 0;
- else
- for(div = 6; div <= INT_MAX/2+1; div += 6)
- if(INT_MAX % (div-1) == 0 || INT_MAX % (div+1) == 0){
- is_prime = 0;
- break;
- }
- if(is_prime)
- printf("%d is a prime", INT_MAX);
- else
- printf("%d is not a prime", INT_MAX);
- return 0;
- }
复制代码 时间减少了大约1/3, 2.12s
最后,试除到sqrt(n), 并且筛掉所有偶数- #include <stdio.h>
- #include <math.h>
- #include <limits.h>
- int main()
- {
- int is_prime = 1;
- int upper = sqrt(INT_MAX);
- if(INT_MAX % 2 == 0)
- is_prime = 0;
- else{
- int div;
- for(div = 3; div <= upper; div+=2)
- if(INT_MAX % div == 0){
- is_prime = 0;
- break;
- }
- }
- if(is_prime)
- printf("%d is a prime\n", INT_MAX);
- else
- printf("%d is not a prime\n", INT_MAX);
- return 0;
- }
复制代码 时间测定是0.00s,就不继续往下写了…… |
|