哥德巴赫猜想的测试及分析
来源:互联网 发布:淘宝换货售后卡怎么填 编辑:程序博客网 时间:2024/06/16 19:54
哥德巴赫猜想:任何一个偶数都可以拆分成两个质数的和
1)针对哥德巴赫猜想,论证10000000以内的偶数都可以被拆成两个质数的和。
#include<stdio.h>
#include<math.h>
#define N 10000000
int prime(int m)
{
int i,sq,flag=1;
if(m==2)flag=0;
else if(m<2||flag%2==0)flag=1;
else
for(i=3,sq=sqrt(m);i<=sq;i+=2)
if(m%i==0){flag=0;break;}
return flag;
}
int judge(int n)
{
int i;
for(i=2;i<=n/2;i++)
if(prime(i)&&prime(n-i))return 1;
return 0;
}
int main()
{
int i;
for(i=6;i<N;i+=2) if(judge(i)==0)printf("%d is wrong!\n",i);
}
分析:关于判断是不是质数函数:小于二的数不是质数,大于二的偶数不是质数,所以从3开始讨论奇数,当且能被不超过sqrt(m)的数整除后才能不是质数。可是运行速度很慢
下面的算法验证相同的范围就很快了
#include<stdio.h>
#include<math.h>
#include<string.h>
#define N 10000000
char prime[N+1];
void fill()
{
int i,j;
memset(prime,1,N);
prime[0]=prime[1]=0;
for(i=2; i*i<=N; i++)
{
if(prime[i])
for(j=i*i; j<N; j+=i)prime[j]=0;
}
}
void print()
{
int i;
for(i=0; i<N; i++)
if(prime[i])printf("%d ",i);
}
int judge(int n)
{
int i;
for(i=3; i<=n/2; i+=2)
if(prime[i]&&prime[n-i])return 1;
return 0;
}
int main()
{
int i;
fill();
for(i=6; i<N; i+=2)
if(judge(i)==0)
printf("%d is wrong!\n",i);
}
后者的算法是先将质数存表,具体实现是创建一个数组,全部赋值1,然后从最小数开始考虑,先将0,1赋值为0,及表示不是质数,然后从2考虑,只考虑i*i开始的整数,因为i*j(j<i)的部分已经在比i更小的整数考虑过了,然后只需要从i*i开始以i为单位递加,因为考虑的是i的倍数,不是i的倍数的整数在其他整数的循环中考虑,然后第二次循环前有一个if(prime[i])判断,是因为若不是质数,则该数的整数倍早已经在比该数小的整数时候考虑过了。
- 哥德巴赫猜想的测试及分析
- 哥德巴赫猜想的解析
- 哥德巴赫猜想的拓展
- 哥德巴赫猜想的拓展
- 哥德巴赫猜想的实现
- 哥德巴赫猜想的近似证明
- JAVA_哥德巴赫猜想的证明
- 哥德巴赫猜想
- 哥德巴赫猜想
- 哥德巴赫猜想
- 哥德巴赫猜想。
- 哥德巴赫猜想
- 哥德巴赫猜想
- 哥德巴赫猜想
- 哥德巴赫猜想
- 哥德巴赫猜想
- 哥德巴赫猜想
- 哥德巴赫猜想
- CRT函数相关问题,gets_s和strcpy_s的用法
- 黑马程序员——C语言——C语言程序编写
- c++模板元编程六:integral_constant 类
- 【Android开发】高级组件-拖动条和星级评分条
- C++虚函数调用
- 哥德巴赫猜想的测试及分析
- 黑马程序员——C语言——计算机和软件基本常识
- hdoj 1395 2^x mod n = 1
- 网络设备与冲突域和广播域
- 第五周 阅读程序 在 main 函数中,可设置指向对象public 成员、对象函数还有对象的指针
- 常用的搜索排序算法总结
- Android在layout xml中使用include 问题
- R数据类型
- 如何用一台普通相机拍照红蓝立体3D图片