实验:验证哥德巴赫猜想

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

    }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值