判断一个数是否为素数c语言代码_C语言编程:验证哥德巴赫猜想

8eed5601e06f4a8b8042a0fd65155b84.png

往期C语言实战练习 ★ C语言能打印任意大小的菱形?当然! ★ C语言编程:打印一个圆形 ★ C语言编程:输入一个字符串,然后逆序输出 ★ 求1000以内的水仙花数 ★ C语言编程判断回文数 ★ 随机产生 100 之内的整数并赋值给二维数组 a[3][4],并求所有元素和 ★ C语言编程求阶乘和:1!+2!+3!+ ... + n!

正文开始

+

大家好,我是阿汤哥,前两天在后台看到有朋友问验证哥德巴赫猜想,今天我们就来看个相关的问题。题目 哥德巴赫猜想中写到,一个充分大的偶数(大于等于6),它可以分解为两个素数(质数)的和。 要求: 将输入的偶数n ,分解为两个素数的所有可能打印出来。思路 哥德巴赫猜想用数学式表达: a = b + c(其中a是大于等于6的整数,b和c是素数) 这个问题就等价于:对于一个给定的大于等于4的偶数a,怎么找到素数b和c呢? 可以用循环的方法,把b的值从3循环到a-3,那么对应的c的值就是a-3到3。然后我们分别对每一组的b和c值进行是否是素数的判断。如果某一组b和c值满足要求,我们就打印。画个表格,更形象一点:

b

c

3

a-3

4

a-4

5

a-5

...

...

a/2

a/2

a-5

5

a-4

4

a-3

3

看了表格,你可以发现方法可以更简洁一点:因为黄色和蓝色部分的b,c只是调换了下位置,但两个数是相同的,所以我们从3循环到a/2就可以了。

这里又涉及到另一个问题,怎么判断一个数是不是素数呢?看过阿汤哥之前求1~1000之间素数文章(点击进入:C语言编程求解:1到1000之间所有的素数)的童鞋应该知道,这里我们多说一下:

判断 素数 

先给出素数的定义:

  • 素数是只能被1和自身整出的整数。

  • 1不是素数

算法思考:

判断一个数是不是素数,只需要判断它是不能只能被1和自身整除。

那怎么判断一个数不能被除1和自身之外的其他数整除呢?想法是写一个循环,循环里依次除以从2到这个数减1的所有的整数,如果都不能整除,说明这个数是素数;如果出现一个能整除的数,那么这个数不是素数。

(其实,判断素数还可以优化,循环里依次除以从2到这个数平方根的所有的整数就可以了。因为假设一个数n,除以2~根号n的整数,都不能整除,那么除以根号n~n-1的整数也不能整数。在文章最后再贴上优化的代码。)

那怎么判断能不能整除呢?我么知道C语言有求余数的运算符%,如果余数是0,那么说明能整除了。

我们来写程序代码。这里,说明一下,当你写一个具有某个功能的代码的时候,把这个功能写成一个函数,而不是所有的代码都放在main函数里。在main函数里调用这个你写的函数。

给函数命名,如果你知道或者查到了素数的英文单词是prime number,那么函数可以起名为 is_primer_number(如果你不知道素数的英文单词,那么随便起个名字也可以,比如叫fun)。因为要传递一个代判断的整数,所以有一个int类型参数。返回值我们用bool型(代码里要包含头文件stdbool.h),如果是素数返回true,如果不是素数返回false。

判断素数代码:

bool is_prime_number(int a)
{
    for (int i = 2; i         if (a % i == 0)
            return false;
    }
    return true;
}
C语言代码
/**
 * Author: 阿汤哥
 * 微信公众号:C语言修仙
 * 功能: 将输入的偶数num ,分解为两个素数的所有可能打印出来。
 */


# include 
# include 
# include 

/*
* 函数功能:判断数a是不是素数
* @ a: 被判断是不是素数的整数
* 返回值:如果a是素数,返回true;如果a不是素数,返回false
*/
bool is_prime_number(int a){
    for (int i = 2; i         if (a % i == 0)
            return false;
    }

    return true;
}

/*
* 函数功能:将偶数num ,分解为两个素数的所有可能打印出来。
* @ num: 待分解的偶数
*/
void fun(int num){
    if (num 6 || num%2 != 0)   //合法性判断
    {
        printf("无效的数字!\n");
        return;
    }

    for (int i = 3; i <= num/2; i++)
    {
        if (is_prime_number(i) == true   // 如果i是不是素数
            && is_prime_number(num-i) == true)   //并且num-i也是素数
        {
            printf("%d = %d + %d\n", num, i, num - i);  //那么打印
        }
    }

}

int main(){
    int num;
    printf("请输入一个大于等于6的偶数:\n");
    scanf("%d", &num);
    fun(num);

    return 0;
}
运行结果 输入8: 79984f2f47df1d7ac7d6d6a5fc73187b.png 输入20 2636655df0b6390af363a816b9b4ada5.png 输入40 da6515b3252db2c9ae7e3c4da663ab36.png 往期推荐好文 编程软件下载与安装: ★C语言编程工具的选择 ★ 一步步教你下载安装编程工具CodeBlocks和编写第一个程序 ★一步步教你下载安装编程工具VS2019和编写第一个程序 ★一步步教你下载安装编程工具VC++6.0和编写第一个程序 其他好文★i++和++i有什么区别?★看完你就明白:什么情况下该用int main(int argc, char *argv[])而不是int     main(void)★C语言编程:打印一个圆形★福利:50本C语言电子书免费送了! ★ [必读]C语言学习者常见问题及回答 ★ 硬核!用这个工具看了i++和++i的汇编代码,小白也能明白它们的区别

17935a8a12b0e87026d3fc78f3cac1c4.png

点个在看

你最好看

e60175b94744b25cd10855812e209226.png
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值