学习记录–
任何一个大于2的偶数都可以分解成两个素数之和;
任何一个大于5的奇数都可以分解成三个素数之和。
写两个函数验证一下这个著名的猜想。
一个整数N,代表要验证的数,5≤N≤100005 \le N \le 100005≤N≤10000,当N为偶数时,验证哥德巴赫猜想1,当N为奇数时,验证哥德巴赫猜想2。
对每个验证,输出相应的表达式,要求加数构成的序列的字典序最小,即确保第一位最小,再确保第二位最小(再确保第三位最小)。
N=13,13=3+3+7=7+3+3
//也可以在两个被调用函数里面再次调用求素数函数使代码简洁
#include <stdio.h>
#include <math.h>
void OddDiv(int n)
{
int a,b,i,j,k,h;
for(a=2;a<n;a++) //先将奇数分解为一个素数跟一个数,因此先求出第一个素数
{
for(i=2;i<a;i++) //判断素数部分
{
if(a%i==0)
break;
}
if(i==a) //若为素数,b为另一个数
b=n-a;
for(k=2;k<n;k++) //将b分解为两个素数相加
{
for(i=2;i<k;i++) //判断素数部分
if(k%i==0)
break;
if(i==k) //若k为素数,则b分解为h和k
h=b-k;
for(j=2;j<h;j++) //判断h是否为素数
{
if(h%j==0)
break;
}
if(j==h) //若h为素数,跳出循环
{
break;
}
}
if(n==a+k+h) //若n分解为三个素数,则输出
{
printf("%d=%d+%d+%d",n,a,k,h);
break;
}
}
}
void EvenDiv(int n) //偶数函数
{
int a,b,i,j;
for(a=2;a<n;a++) //判断小于n且从2开始的每个数是否为素数
{ //并保证从最小的素数开始
for(i=2;i<a;i++) //判断素数部分
if(a%i==0)
break;
if(i==a) //若为素数,则令b=n-a,并判断b是否为素数
b=n-a;
for(j=2;j<b;j++) //判断素数部分
{
if(b%j==0)
break;
}
if(j==b) //若b为素数则输出
{
printf("%d=%d+%d",n,a,b);
break;
}
}
}
int main()
{
int n;
scanf("%d", &n); //输入一个数判断他是奇数还是偶数并调用不同函数。
(n % 2 == 0) ? EvenDiv(n) : OddDiv(n);
return 0;
}