哥德巴赫猜想C语言
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
06 for (i=3; i<=half; i+=2)
07 {
08
if (IsPrimer(i) && IsPrimer(n-i))
09
{
10
*tmpNumA = i;
11
*tmpNumB = n-i;
12
return 1;
13
}
14 }
15 return 0;
16 }
19.2.2 问题实现
➢ 3. 要求用户输入,判断,并输出结果。 ➢ 在主程序中,要求用户输入一个大于6的偶
19.2.1 问题分析
➢ 我们在编程之前,需要明确两个数学概念:素数和 偶数。
➢ ⑴ 素数就是质数,指在一个大于1的自然数中,除 了1和此整数自身外,没法被其他自然数整除的数。 换句话说,只有两个正因数(1和数自身)的自然 数即为素数。
➢ ⑵ 偶数就是能被2整除的自然数,如2、4、6、 8……。
➢ 根据题目,要求是奇素数,即这个素数不可以是2, 一定要大于2。我们需要划分以下两个子模块。
09
return 0;
10 /*如果它存在两个因数,乘积等于n,要么两个因数一定一个小于根号n, 一个大于根号n要么两个因数都等于根号n*/
11 nqrt = (unsigned long)sqrt(n);
12 for(i=2; i<=nqrt; i+=1)
13 {
14
if (n%i == 0)
15
19.2 问题分析及实现
➢ 19.2.1 问题分析 ➢ 19.2.2 问题实现 ➢ 19.2.3 程序运行
19.2 问题分析及实现
➢ 拿到一个要求实现的算法问题,首先要看清、 想明、把握每一个细节。只有这样,才可以 顺利地将算法实现。由问题描述:“每个不 小于6的偶数都可以表示为两个奇素数之 和”,可知,我们要实现的是判断任何一个 大于6的偶数都可以有两个素数相加。以下 将仔细地分析问题并实现算法。
19.3 开发过程常见问题及解决
➢ 开发过程常见问题及解决办法如下,仅供参考。 ➢ ⑴ 如果出现“warning C4013: 'sqrt'
undefined; assuming extern returning int”的 编译警告,通常需要在程序开头添加数学函数头文 件“#include <math.h>”。 ➢ ⑵ 此程序的难点之一是如何判断一个数为素数。 这点在程序中已经给出一注释,希望读者细细体会。
⑴ 判断一个数是否为素数。 ⑵ 判断并分解大小素数的和是否等于需判断的偶数。
19.2.2 问题实现
➢ 1. 判断输入的数字是否是素数 ➢ 对于一个任何自然数,如何判断他是素数呢?
如果这个自然数n,它存在两个因数,乘积 等于n,要么两个因数一个是小于 、 n一 个大于 ,n 要么两个因数都等于 n。那么, 根据这个思路,代码如下(代码19-1.txt)。
19.2.2 问题实现
01 int IsRight(unsigned long n, unsigned long *tmpNumA, unsigned long *tmpNumB)
02 {
03 unsigned long i;
04 unsigned long half;
05 half = n/2;
数,调用判断函数,判断“猜想”是否成立, 成立则输出等式,不成立则输出“猜想”错 误。代码如下(代码19-3.txt)。
19.2.2 问题实现
01 int main(void)
02 {
03 unsigned long number; /*被验证的数*/
04 unsigned long a, b; /*和为number的两个素数*/
➢ ⑶ 此程序另一难点是分解成素数。其实就是从最 小素数开始,将最小素数i作为素数A,将偶数减i作 为素数B,在A、B都是素数的情况下,分解成功。
return 0;
百度文库
16 }
17 return 1;
18 }
19.2.2 问题实现
➢ 2. 将数偶数分解成两个素数,并判断“猜 想”结论是否成立。
➢ 取一个数i,从最小素数开始到这个偶数的一 半大小进行判断,当i为素数同时n-i也是素 数时,这时猜想结论成立,否则结论不成立。 代码如下(代码19-2.txt)。
19.2.1 问题分析
➢ 而我们的将要编写的程序,就是为了验证哥 德巴赫猜想中提到的任何一个偶数,对大于 6的偶数n可以分解成两个素数的和,这个结 论是否正确。所以,程序应该可以输入一个 数,判断是否为偶数,将这个偶数分解成一 个小素数和大素数。再分别判断小素数与大 素数之合是否就等于这个偶数。而且,需要 将结果打印输出。
19.2.2 问题实现
01 /*测试n是否是素数。如果是,返回1,否则返回0 */
02 int IsPrimer(unsigned long n)
03 {
04 unsigned long i;
05 unsigned long nqrt;
06 if (n == 2)
07
return 1;
08 if (n == 1 || n%2 == 0)
05 do
06 {
07
printf("请输入要验证的大于等于6的偶数(输入0则退出):");
08
scanf("%lu", &number);
09
if (number >= 6 && (number % 2 == 0))
10
{
11
if (IsRight(number, &a, &b))
12
{
13
printf("哥德巴赫猜想对此数是正确的。\n");
14
printf("%lu = %lu + %lu\n", number, a, b);
15
}
16
else
17
{
18
printf("%lu,哥德巴赫猜想对此数是错误!", number);
19
}
20
}
21 } while(number != 0);
22
23 return 0;
24 }
19.2.3 程序运行
第19章
哥德巴赫猜想
问题描述 问题分析及实现 开发过程常见问题及解决
第19章
哥德巴赫猜想
问题描述 问题分析及实现 开发过程常见问题及解决
第19章
哥德巴赫猜想
问题描述 问题分析及实现 开发过程常见问题及解决
第19章
哥德巴赫猜想
问题描述 问题分析及实现 开发过程常见问题及解决
哥德巴赫猜想
➢ 从哥德巴赫猜想(Gold Bach Conjecture) 提出这个猜想至今,许多数学家都不断努力 想攻克它,但都没有成功。本章将使用C语 言从算法问题入手,并一步步实现一个验证 “猜想”结论正确性的程序。
19.1 问题描述
➢ 哥德巴赫猜想大致可以分为以下两个猜想。 ➢ ⑴ 二重哥德巴赫猜想:每个不小于6的偶数都可以
表示为两个奇素数之和,如下: ➢ 6=3+3;8=3+5;10=5+5…… ➢ ⑵ 三重哥德巴赫猜想:每个不小于9的奇数都可以
表示为三个奇素数的和,如下: ➢ 9=3+3+3;11=3+3+5;13=3+5+5 ➢ 在这里,我们以二重哥德巴赫猜想作为研究对象,
通过编写C语言程序,来验证“猜想”的正确性。