哥德巴赫猜想

作者:追风剑情 发布于:2015-1-4 21:53 分类:Algorithms

     任一充分大的偶数都可以表示成二个素数的和,或是一个素数和一个半素数的和。


数值验证: C语言


  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <conio.h>
  4.  
  5. // Eratosthenes算法
  6. // 将指定范围中的素数都筛选出来保存到一个数组中。
  7. int CreatePrime(int n, int prime[])
  8. {
  9. int i,j;
  10. for(i=2; i<=n; i++)//初始化数组
  11. prime[i] = 1;//标志为1表示对应的数是质数
  12. prime[0]=prime[1]=0;
  13. for(i=2; i*i<=n; i++)//循环处理前i个
  14. {
  15. if(prime[i] == 1)//若为素数标记
  16. {
  17. for(j=2*i; j<=n; j++)//筛去合数
  18. {
  19. if(j%i==0)//能被整除
  20. prime[j]=0;//不是素数
  21. }
  22. }
  23. }
  24. }
  25.  
  26. int main()
  27. {
  28. int n,i,j,flag;
  29. int *prime;
  30. printf("哥德巴赫猜想验证\n");
  31. printf("输入一个要验证的最大数n(n>=6:)");
  32. scanf("%d", &n);
  33. if(n < 6)//判断输入数据是否合法
  34. {
  35. printf("数据输入错误!\n");
  36. return 0;
  37. }
  38. if(!(prime=(int *)malloc(sizeof(int)*n)))
  39. {
  40. printf("分配内存失败!\n");
  41. getch();
  42. return 0;
  43. }
  44. CreatePrime(n, prime);//生成素数数组
  45. for(i=6; i<=n; i+=2)//从6开始,循环验证各偶数
  46. {
  47. flag = 1;
  48. for(j=2; j<=i/2; j++)
  49. {
  50. //判断组成每个数的两个加数
  51. //若一个加数是偶数,不判断素数
  52. if(j%2==0 || ((i-j)%2==0)) continue;
  53. //若两个加数都是素数
  54. if(prime[j]==1 && prime[i-j]==1)
  55. {
  56. printf("%d=%d+%d\n", i, j, i-j);//输出素数
  57. flag = 0;//清除标志
  58. break;
  59. }
  60. }
  61. if(1==flag)
  62. printf("找到一个不符合要求的偶数:%d\n", i);
  63. }
  64.  
  65. getch();
  66. return 0;
  67. }


运行结果: 找1000000以内的素数

shushu.png

标签: Algorithms

Powered by emlog  蜀ICP备18021003号-1   sitemap

川公网安备 51019002001593号