實驗:驗證哥德巴赫猜想
阿新 • • 發佈:2018-12-24
//哥德巴赫猜想:即任一個大於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);
}
}
}