1 //例题4-2 2 /* 3 *如果n和n+2都是素数,则称它们是孪生素数。输入m,输出两个数均不超过m的最大孪生素数。5<=m<=100。例如m=2时答案是17、19,m=1000时答案是881、883。 4 */ 5 6 //程序4-2 孪生素数(1) 7 #include <stdio.h> 8 /* do NOT use this if x is very large or small 9 *n太小时n=1会被错误地判断为素数,太大时i*i可能溢出 10 */ 11 //判断素数 12 int is_prime(int x) 13 { 14 int i; 15 for(i = 2; i*i <= x; i++) //判断不超过sqrt(x)的整数i 16 if(x % i ==0) return 0; //一旦发现有一个大于1的因子,立刻返回0(假) 17 return 1; //最后返回1(真) 18 } 19 20 int main() 21 { 22 int i, m; 23 scanf("%d", &m); 24 for(i = m-2; i >= 3; i--) 25 if(is_prime(i) && is_prime(i+2)) 26 { 27 printf("%d %d\n", i, i+2); 28 break; 29 } 30 return 0; 31 } 32 33 //程序4-2 孪生素数(2) 34 #include <stdio.h> 35 #include <math.h> 36 #include <assert.h> 37 //判断素数 38 int is_prime(int x) 39 { 40 int i, m; 41 assert(x >= 0); //assert.h宏限制非法函数调用,当x>=0不成立时程序异常终止并给出提示消息 42 if(x == 1) return 0; 43 m = floor(sqrt(x) + 0.5); //避免每次重复计算sqrt(x)和浮点误差 44 for(i = 2; i*i <= x; i++) //判断不超过sqrt(x)的整数i 45 if(x % i ==0) return 0; //一旦发现有一个大于1的因子,立刻返回0(假) 46 return 1; //最后返回1(真) 47 } 48 49 int main() 50 { 51 int i, m; 52 scanf("%d", &m); 53 for(i = m-2; i >= 3; i--) 54 if(is_prime(i) && is_prime(i+2)) 55 { 56 printf("%d %d\n", i, i+2); 57 break; 58 } 59 return 0; 60 }
亲爱的读者:如果觉得本文对你有所帮助,请点击推荐,分享给其他人!