用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;
}