1742年,德国数学家哥德巴赫发现,每个不小于6的偶数都可以表示为两个素数(只能被1和它本身整除的数)之和。如6=3+3,12=5+7等等。同年哥德巴赫写信给当时的大数学家欧拉,欧拉回信说,他相信这个猜想是正确的,但他不能证明。这就是数学史上著名的哥德巴赫猜想。从哥德巴赫猜想提出至今,还没有人从理论上证明这一猜想,曾经有人对哥德巴赫猜想进行了具体的验证工作:6 = 3 + 3, 8 = 3 + 5, 10 = 5 + 5 = 3 + 7, 12 = 5 + 7, 14 = 7 + 7 = 3 + 11,16 = 5 + 11, 18 = 5 + 13, ……等等,对[6,3564]范围内偶数进行验算,说明哥德巴赫猜想是成立的。
请用C编程,将6-100间的偶数都表示成为两个素数之和,输出结果时每行输出5组,如下列所示:
6 = 3 + 3, 8 = 3 + 5,10 = 3 + 7,12 = 5 + 7,14 = 3 + 11,
16 = 5 + 11,18 = 5 + 13,20=3 + 17,22 = 5 + 17, 24 = 5 + 19,
……………
#include <iostream>
#include <cmath>
using namespace std;
void gotbaha (int a);
bool prime (int a);
int main()
{
int a;
cin>>a;
gotbaha (a);
system("pause");
return 0;
}
void gotbaha (int a)
{
int i;
int j=1;
for(i=2;i<=a/2;i++)//2是素数
{
if(prime(i)==true&&prime(a-i)==true)
cout<<a<<"="<<i<<"+"<<a-i;
j=j+1;
if(j==5) {cout<<endl; j=1;}
}
}
}
bool prime(int a)
{
int i;
bool b;
b=true;
for(i=2;i<=int(sqrt(a));i++)
{
if(a%i==0)
{
b=false;
break;
}
}
return (b);
}
分两步,第一步是把100以内的质数全部找出来
第二步,针对每一个偶数,看看是否能拆分为两个质数之和
int main(){
//用大筛法求出100以内的质数
int [100] zhishu; // 值为0表示非质数
for(int i =0; i< 100; i ++) zhishu[i] = 1;// 假定全部是质数
zhishu[0] = 0; zhishu[1] = 0;//0,1不是质数
for(int i = 2; i < 100; i++){
if(zhishu[i] == 1){ //如果当前这个是质数,就宣布所有他的倍数不是质数
for(int j = i * 2; j < 100; j +=i) zhishu[j] = 0;
}
}
///因为一个偶数减去2一定还是一个偶数,所以,哥德巴赫猜想里面的两个素数一定没有2,在这里我们把2也去掉,可以减少一点点运算量
zhishu[2] = 0;
/////开始计算
int c = 0;//用来表示第几列,5列换行
for(int i = 6; i <= 100; i+= 2){
for(int j = 3; j < 100; j++){
if(zhishu[j] == 1 && zhishu[i - j] ==1){ //如果构成这个偶数
printf("%d = %d + %d, ",i, j, i -j);
c = (c+1) % 5;
if(c == 0) printf("\n");
break;
}
}
}
}
我手头上没有编译环境,不敢保证代码正确,逻辑上的问题应该不大,如果有问题可以Q我,我们共同解决