1. 程式人生 > >實驗:驗證哥德巴赫猜想

實驗:驗證哥德巴赫猜想

//哥德巴赫猜想:即任一個大於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); } } }