23.12.6 验证哥德巴赫猜想

任务描述

本关任务:编写一个代码程序解决哥德巴赫猜想的验证问题。

相关知识

著名的哥德巴赫猜想是这样的:

  1. 任何一个大于2的偶数都可以分解成两个素数之和;
  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);
    }
}

  • 9
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值