您的位置:首页 > 其它

实验:验证哥德巴赫猜想

2016-09-27 08:55 225 查看
//哥德巴赫猜想:即任一个大于2的偶数都可以写成两个质数之和

//请验证这个对于较大的偶数都是成立的

//算法:goldbach(n)

//输入:整数n

//输出:1表示成立,0表示猜想有误

#include "stdafx.h"
#include "stdio.h"
#include <iostream>
#include <fstream>
#include <vector>
#include <math.h>
#include<ctime>
#define N 5000
using namespace std;

//函数声明
void getPrimeNumber(vector<int> &primeNumbers,int n);//得到n以前的质数
int goldBach(int n, vector<int> &primeNumbers);//验证哥德巴赫猜想

int _tmain(int argc, _TCHAR* argv[])
{
ofstream output("c://output.");
vector<int> primeNumbers ; //存质数

for ( int testN = 100 ; testN <= N ;testN += 100)
{
clock_t _start = clock();

getPrimeNumber(primeNumbers,testN); //得到质数

//哥德巴赫猜想
if (goldBach(testN,primeNumbers) == 1 )
{
clock_t _end = clock();

cout<< float(_end - _start)  <<endl;

output<<testN<<","<<float(_end - _start) <<endl;
}

}

output.close();
getchar();

return 0;
}

//验证哥德巴赫猜想
int goldBach(int n, vector<int> &primeNumbers)
{
int isGoldBach = 1 ;
int index1 ,index2;

int n1,n2;
for ( int i = 4 ; i != n+1 ; i++)
{
if( i % 2 != 0 )
continue ;
int flag = 0 ;
for( index1 = 0; index1 < primeNumbers.size(); index1 ++ )
{
n1 = primeNumbers.at(index1);
if( n1 > i /2 )
break ;

for(index2 = primeNumbers.size() - 1 ; index2 >= 0; index2 -- )
{
n2 = primeNumbers.at(index2);
if( n2 < i / 2)
break ;

if( n1 + n2 == i)
{
flag = 1 ;
cout<<n1 << " + " << n2 << " = " << i << endl ;
break ;
}
}
if(flag == 1)
{
//  cout << n1<<" + "<<n2 << " = "<<i<<endl;
break ;
}
}
if( !flag )
{
isGoldBach = 0 ;
cout << " 验证失败 " << endl;
break ;
}
}

return isGoldBach;
}

//得到n之前的素数
void getPrimeNumber(vector<int> &primeNumbers,int n)
{
primeNumbers.clear();
if(n <= 2)
{
return ;
}

bool isPrime ;
for(int i = 2 ; i != n ; i++)
{
if( i == 2 || i == 3)
{
primeNumbers.push_back(i);
continue;
}
isPrime = true ;
for( int j = 2 ; j != i ; j ++)
{

if ( i % j == 0)
{
isPrime = false ;
break ;
}

}
if(isPrime)
{
primeNumbers.push_back(i);
}

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: