sthyu 发表于 2021-4-4 16:28:20

C语言的作业

是作业,不太明白
题目:编写一个程序,验证德巴赫猜想,任意一个大于6的偶数均可以表示为两个素数之和。要求:
a)输出6~20之间的偶数表示成素数之和的表达式。
b)每行输出5个表达式,每个式子之间间隔一个Tab位置,(用\t实现),且上下两行的式子要对齐。
c)统计并输出6~20之间的偶数可表示成素数之和的表达式形式个数。

yuxijian2020 发表于 2021-4-4 18:15:43

给你个思路吧,假设输入的数为X
从2开始,每个素数被X减,然后计算结果是否是素数如果是就打印
如果不要求空间复杂度,可以先计算所有比X小的素数,然后存到数组里,然后for循环就完事
要求空间复杂度,那就没计算一个素数就计算(X-素数)是不是素数,是就打印

yuxijian2020 发表于 2021-4-4 18:36:27

本帖最后由 yuxijian2020 于 2021-4-4 18:38 编辑

#include <stdio.h>

#define bool        int
#define true        1
#define false        0

//计算素数
bool PrimeNumber(unsigned int n)
{
        for (int i = n - 1; i > 1; i--)
        {
                if (n % i == 0)
                        return false;
        }

        return true;
}
//哥德巴赫猜想计算
void Goldbach(unsigned int n)
{
        int index = 0;                                                //用于每行显示5条结果
        for (int i = n - 1; i > 1; i--)
        {
                if (!PrimeNumber(i) || !PrimeNumber(n - i))                        //如果i不是素数,或者n - i不是素数,就直接跳过
                        continue;

                printf_s("%3d + %3d = %3d", i, n - i, n);
                index++;

                if (index % 5 != 0)
                        printf_s("\t");
                else
                {
                        printf_s("\n");
                }
        }
}

void GetInputAndPrint()
{
        int X = 0;
       
        while (X <= 6)                                                        //如果输入的数小于等于6就重新输入
        {
                printf_s("请输入一个大于6的数:\n");
                scanf_s("%d", &X);

                if (X <= 6)
                        printf_s("输入错误!请确保输入的数大于6!\n");
        }

        Goldbach(X);
}

int main()
{
        GetInputAndPrint();
}
页: [1]
查看完整版本: C语言的作业