正文开始
+
大家好,我是阿汤哥,前两天在后台看到有朋友问验证哥德巴赫猜想,今天我们就来看个相关的问题。题目 哥德巴赫猜想中写到,一个充分大的偶数(大于等于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:
输入20
输入40
往期推荐好文
编程软件下载与安装:
★C语言编程工具的选择 ★
一步步教你下载安装编程工具CodeBlocks和编写第一个程序
★一步步教你下载安装编程工具VS2019和编写第一个程序
★一步步教你下载安装编程工具VC++6.0和编写第一个程序
其他好文★i++和++i有什么区别?★看完你就明白:什么情况下该用int main(int argc, char *argv[])而不是int main(void)★C语言编程:打印一个圆形★福利:50本C语言电子书免费送了!
★
[必读]C语言学习者常见问题及回答
★
硬核!用这个工具看了i++和++i的汇编代码,小白也能明白它们的区别
点个在看
你最好看