C语言验证哥德巴赫猜想

用C语言 验证哥德巴赫猜想
【问题描述】哥德巴赫猜想:一个不小于6的偶数可以表示为两个素数之和。要求验证a~b之间的全部偶数,6 <= a < b <= 2000。

【输入形式】a b两个数字
【输出形式】按行输出,每行如6 = 3 + 3,前一个素数尽可能小。

【样例输入】

6 10

【样例输出】

6 = 3 + 3

8 = 3 + 5

10 = 3 + 7

【样例说明】注意输出中的空格。

int IsPrime (int x)
{
    int b = 0, c = 0;
    b = sqrt (x);
    for (c = 2; c <= b; c++) {
        if (x % c == 0){
            return 0;
        }
    }
    return 1;
}

int GetOutput(int x)
{
    int i = 0;
    for (i=3; i<=x/2; i++){
        if (IsPrime(i) && IsPrime(x-i)){
            printf ("%d = %d + %d\n", x, i, x-i);
            break;
        }
    }
}

int main()
{
    int a = 0, b = 0, x = 0;
    printf ("Please input a b:\n");
    scanf("%d %d", &a, &b);

    if (a<6 || a>2000 || a>=b || b<6 || b>2000){        printf ("Input out of range\n");
        return -1;
    }

    for (x=a; x<=b; x++){
        if (x%2){
            continue;
        }
        GetOutput(x);
    }

    return 0;
}

// caimi10.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <algorithm>
#include <vector>

using namespace std;


// 是素数
bool IsZhiShu(const int n)
{
    int i = 0;
    double divm = sqrt(n);

    if (n == 1)
    {
        return false;
    }
    else if (n==2||n==3)
    {
        return true;
    }
    for (i = 2; i <= divm; i++)           /*用for函数重复下面步骤*/
    {
        if (n%i == 0)              /*判断输入的数是否能被除1和本身以外的数整除*/

            break;

    }

    if (i > divm)                 /*判断i是否大于m*/
    {
        return true;
    }
    else
    {
        return false;
    }
}

// 小于n的所有素数
vector<int> AllSuShu_xiaoyuN(int n)
{
    vector<int> vecAllSuShu;
    vecAllSuShu.reserve(2000);
    for (size_t i = 2; i < n; i++)
    {
        if (IsZhiShu(i))
        {
            vecAllSuShu.push_back(i);
        }
    }
    return vecAllSuShu;
}


int _tmain(int argc, _TCHAR* argv[])
{
    printf("6~2000以内 哥德巴赫猜想: 一个不小于6的偶数可以表示为两个素数之和。\n");

    int a = 0;
    int b = 0;
    do
    {
        printf("输入a\n");
        scanf_s("%d", &a);
        printf("输入b\n");
        scanf_s("%d", &b);

    } while ((a<6||a>2000)  ||  (b<6||b>2000) || a%2!=0 || b%2!=0);


    vector<vector<int>> vecvec_i_i1_i2;
    vector<int> vec_i_i1_i2;
    vec_i_i1_i2.resize(3);
    vector<int> vecAllSushu;

    for (int i = a; i <= b; i=i+2)
    {
        // 小于i的所有素数
        vecAllSushu = AllSuShu_xiaoyuN(i);

        // 所有组合
        for (int j = 0, length = vecAllSushu.size(); j < length; j++)
        {
            if (IsZhiShu(i - vecAllSushu[j]))
            {
                vec_i_i1_i2[0]=(i);
                vec_i_i1_i2[1] = (vecAllSushu[j]);
                vec_i_i1_i2[2]=(i-j);
                vecvec_i_i1_i2.push_back(vec_i_i1_i2);
                break;
            }
        }

    }

    for (int i = 0, count = vecvec_i_i1_i2.size(); i < count; i++)
    {
        printf("%d  = %d  + %d", vecvec_i_i1_i2[i][0], vecvec_i_i1_i2[i][1], vecvec_i_i1_i2[i][2]);
        printf("\n");
    }

    _tsystem(L"pause");

    return 0;
}