任务描述
本关任务:编写一个代码程序解决哥德巴赫猜想的验证问题。
相关知识
著名的哥德巴赫猜想是这样的:
- 任何一个大于2的偶数都可以分解成两个素数之和;
- 任何一个大于5的奇数都可以分解成三个素数之和。
现在请你写两个函数验证一下这个著名的猜想。
注意:你提交的代码将被插入到以下程序框架中一起编译,所以请不要提交全部代码。
输入描述
一个整数N,代表要验证的数,5≤N≤10000
,当N为偶数时,验证哥德巴赫猜想1,当N为奇数时,验证哥德巴赫猜想2。
输出描述
对每个验证,输出相应的表达式,要求加数构成的序列的字典序最小,即确保第一位最小,再确保第二位最小(再确保第三位最小)。
例如:
N=13,13=3+3+7=7+3+3
则应输出:
13=3+3+7
编程要求
根据提示,在右侧编辑器补充代码,编写一个代码程序解决哥德巴赫猜想的验证问题。
测试用例
平台会对你编写的代码进行测试:
测试输入:13
; 预期输出:13=3+3+7
//固定头部开始
#include <stdio.h>
#include <math.h>
//固定头部结束
//你的代码开始
int isPrime(int num) {
//此函数可自行增删
}
void OddDiv(int n)
{
}
void EvenDiv(int n)
{
}
//你的代码结束
//固定尾部开始
int main()
{
int n;
scanf("%d", &n);
(n % 2 == 0) ? EvenDiv(n) : OddDiv(n);
return 0;
}
//固定尾部结束
原本乱七八糟的代码:
//固定头部开始
#include <stdio.h>
#include <math.h>
//固定头部结束
//你的代码开始
int isPrime(int num) {
if (num < 2) {
return 0; // 小于2的数字不是质数
}
for (int i = 2; i * i <= num; i++) {
if (num % i == 0) {
return 0; // 找到除数,不是质数
}
}
return 1; // 如果没有找到除数,是质数
}
void EvenDiv(int n)//判断偶数的
{
int a,b; int situation=0;
int i=1,j;
while (isPrime(i)==0&&i<=n-1&&situation==0)
{
for(j=i;j<=n;j++)
{
if(isPrime(j)&&j+i==n)
{
a=i;
b=j;
situation=1;
break;
}
}
i++;
}
printf("%d=%d+%d\n",n,a,b);
}
void OddDiv(int n)
{
int a,b,c; int situation=0;
int i=1,j,k;
while (isPrime(i)==0&&i<=n-2&&situation==0)
{
for(j=i;j<=n-1&&situation==0;j++)
{
if(isPrime(j))
{
for(k=j;k<=n;k++)
{
if(isPrime(k)&&j+i+k==n)
{
a=i;
b=j;
c=k;
situation=1;
}
if (situation ==1) break;
}
}
}
i++;
}
printf("%d=%d+%d+%d\n",n,a,b,c);
}
//你的代码结束
//固定尾部开始
int main()
{
int n;
scanf("%d", &n);
(n % 2 == 0) ? EvenDiv(n) : OddDiv(n);
return 0;
}
//固定尾部结束
修改如下
//优化了判断质数的方式
int isPrime(int num) {
if (num < 2) {
return 0; // 小于2的数字不是质数
}
for (int i = 2; i * i <= num; i++) {
if (num % i == 0) {
return 0; // 找到除数,不是质数
}
}
return 1; // 如果没有找到除数,是质数
}
void EvenDiv(int n) {
int a, b;
int situation = 0;
for (int i = 2; i <= n / 2; i++) {
if (isPrime(i) && isPrime(n - i)) {
a = i;
b = n - i;
situation = 1;
break;
}
}
if (situation) {
printf("%d=%d+%d\n", n, a, b);
} else {
printf("找不到两个素数,使得它们的和为 %d\n", n);
}
}
void OddDiv(int n) {
int a, b, c;
int situation = 0;
//对于循环的范围进行了合理的限定
for (int i = 2; i <= n / 3; i++) {
for (int j = i; j <= (n - i) / 2; j++) {
int k = n - i - j;
if (isPrime(i) && isPrime(j) && isPrime(k)) {
a = i;
b = j;
c = k;
situation = 1;
break;
}
}
if (situation) {
break;
}
}
if (situation) {
printf("%d=%d+%d+%d\n", n, a, b, c);
} else {
printf("找不到三个素数,使得它们的和为 %d\n", n);
}
}