C语言经典算法实例5:验证哥德巴赫猜想
一、问题描述
1.1、什么是哥德巴赫猜想
哥德巴赫1742年在给欧拉的信中提出了以下猜想:任一大于2的整数都可写成三个质数之和 。但是哥德巴赫自己无法证明它,于是就写信请教赫赫有名的大数学家欧拉帮忙证明,但是一直到死,欧拉也无法证明。 因现今数学界已经不使用“1也是素数”这个约定,原初猜想的现代陈述为:任一大于5的整数都可写成三个质数之和。(n>5:当n为偶数,n=2+(n-2),n-2也是偶数,可以分解为两个质数的和;当n为奇数,n=3+(n-3),n-3也是偶数,可以分解为两个质数的和)欧拉在回信中也提出另一等价版本,即任一大于2的偶数都可写成两个质数之和。今日常见的猜想陈述为欧拉的版本。把命题"任一充分大的偶数都可以表示成为一个素因子个数不超过a个的数与另一个素因子不超过b个的数之和"记作"a+b"。1966年陈景润证明了"1+2"成立,即"任一充分大的偶数都可以表示成二个素数的和,或是一个素数和一个半素数的和"。
1.2、什么是半素数
- 什么是半素数
两个素数的乘积所得的自然数
若一个自然数可以表示成两个素数乘积的形式,这个自然数就叫做半素数(又名半质数、二次殆素数)。
- 例如下面的一些数字为半素数。
4,6,9,10,14,15,21,22,25,26,33,34,35,38,39,46,49,51,55,57,58,62,65,69,74,77,82,85,86,87,91,93,94,95,106,111,115,118,119,121,122,123,129,133,134,141,142.
1.3、本文的问题描述
验证哥德巴赫猜想
问题的描述
如下几点所示
- 任一充分大的偶数都可以表示成二个素数的和,或是一个素数和一个半素数的和。
- 偶数输入的为大于6的偶数。
- 对1-100之间的数字进行哥德巴赫猜想的验证。
- 程序采用函数模块化的思路。
二、算法实例编译环境
本文C语言经典算法实例的编译环境,使用的是集成开发环境:Visual Studio 2019
Visual Studio 2019官网链接如下
Visual Studio 2019集成的开发环境的特点有
- Visual Studio 2019默认安装Live Share代码协作服务。
- 帮助用户快速编写代码的新欢迎窗口、改进搜索功能、总体性能改进。
- Visual Studio IntelliCode AI帮助。
- 更好的Python虚拟和Conda支持。
- 以及对包括WinForms和WPF在内的.NET Core 3.0项目支持等
三、算法实例实现过程
3.1、包含头文件
包含头文件 代码如下所示
#pragma once
// 包含头文件
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <stdbool.h>
- 将要用到的C语言头文件包含近年来。
3.2、声明变量
声明变量 代码如下所示
int a = 0;
- 声明了变量a。
- 作为输入的变量使用。
3.3、输入一个大于 6 的偶数
输入一个大于 6 的偶数 代码如下所示
printf("输入一个大于 6 的偶数:");
scanf("%d", &a);
printf("\n");
- 声明相关变量min, max,row, col, n;
3.4、对输入的数字进行哥德巴赫猜想的验证
- 对输入的数字进行哥德巴赫猜想的验证采用函数的方式进行编写。
对输入的数字进行哥德巴赫猜想的验证 代码如下所示
- 进行哥德巴赫猜想的验证函数的声明。
/// <summary>
/// 对输入的数字进行哥德巴赫猜想的验证
/// </summary>
/// <param name="intNum">输入的数字</param>
/// <returns>blFlag</returns>
static bool ISGDBHArith(int intNum);
- 进行哥德巴赫猜想的验证函数的定义。
/// <summary>
/// 对输入的数字进行哥德巴赫猜想的验证
/// </summary>
/// <param name="intNum">输入的数字</param>
/// <returns>blFlag</returns>
static bool ISGDBHArith(int intNum)
{
bool blFlag = false; // 标识是否符合哥德巴赫猜想
if (intNum % 2 == 0 && intNum > 6) // 对要判断的数字进行判断
{
for (int i = 1; i <= intNum / 2; i++)
{
bool bl1 = IsPrimeNumber(i); // 判断i 是否为素数
bool bl2 = IsPrimeNumber(intNum - i); // 判断 intNum-i 是否为素数
if (bl1 & bl2)
{
//输出等式
printf("%d = %d + %d\n", intNum, i, intNum - i);
blFlag = true;
// 符合哥德巴赫猜想
}
}
}
return blFlag; // 返回bool 型变量
}
- 对输入的数字进行哥德巴赫猜想的验证。
- 函数返回为bool类型的变量:blFlag。
3.5、判断输入的数字是否为素数。
- 判断输入的数字是否为素数,采用函数的方式编写。
判断输入的数字是否为素数,代码如下所示
- 判断输入的数字是否为素数的函数声明。
/// <summary>
/// 判断输入的数字是否为素数。
/// </summary>
/// <param name="intNum">输入的数字</param>
/// <returns>blFlag</returns>
static bool IsPrimeNumber(int intNum);
- 判断输入的数字是否为素数的函数定义。
/// <summary>
/// 判断输入的数字是否为素数。
/// </summary>
/// <param name="intNum">输入的数字</param>
/// <returns>blFlag</returns>
static bool IsPrimeNumber(int intNum)
{
bool blFlag = true; // 标识是否是素数
if (intNum == 1 || intNum == 2) // 判断输入的数字是否是 1 或者 2
{
blFlag = true; // 为bool 类型变量赋值
}
else
{
int sqr = (int)(sqrt((double)intNum)); // 对要判断的数字进行开方运算
for (int i = sqr; i >= 2; i--) // 从开方后的数进行循环
{
if (intNum % i == 0) // 对要判断的数字和指定数字进行求余运算
{
blFlag = false; // 如果余数为 0,说明不是素数
}
}
}
return blFlag; // 返回bool 型变量
}
- 判断输入的数字是否为素数。
- 函数返回为bool类型的变量:blFlag。
按F5进行编译,调试结果如下所示。
- 可以正确的输出我们向数组中输入的数据。
3.6、对输入的数字进行哥德巴赫猜想的判断
对输入的数字进行哥德巴赫猜想的判断 代码如下所示
if (blFlag)
{
printf("\n%d:能写成两个素数的和,所以其符合哥德巴赫猜想。\n\n", a);
}
else
{
printf("\n%d:不能写成两个素数的和,所以其不符合哥德巴赫猜想。\n\n", a);
}
- 如果输入的数字能写成两个素数的和,则符合哥德巴赫猜想。
- 如果输入的数字不能写成两个素数的和,则不符合哥德巴赫猜想。
按F5进行编译,调试结果如下所示。
3.7、判断数字1-100是否符合哥德巴赫猜想。
- 判断数字1-100是否符合哥德巴赫猜想采用函数编写的方式。
判断数字1-100是否符合哥德巴赫猜想 代码如下所示。
- 判断数字1-100是否符合哥德巴赫猜想的函数声明。
/// <summary>
/// 判断数字1-100是否符合哥德巴赫猜想。
/// </summary>
void digitJudge();
- 判断数字1-100是否符合哥德巴赫猜想的函数定义。
/// <summary>
/// 判断数字1-100是否符合哥德巴赫猜想。
/// </summary>
void digitJudge()
{
for (int i = 1; i <= 100; i++)
{
bool blFlag =