验证哥德巴赫猜想_哥德巴赫猜想的验证
验证哥德巴赫猜想由刀豆文库小编整理,希望给你工作、学习、生活带来方便,猜你可能喜欢“哥德巴赫猜想的验证”。
例7-3 验证“哥德巴赫猜想”
“哥德巴赫猜想”是数论中的一个著名难题,200多年来无数数学家为其呕心沥血,却始终无人能够证明或伪证这个猜想。 “哥德巴赫猜想”表述为:任何一个大于等于4的偶数均可以表示为两个素数之和。
1742年法国数学爱好者哥德巴赫在给著名数学家欧拉的信中提出“哥德巴赫猜想”问题。
问题的分解
求解第一步 提出问题:
验证哥德巴赫猜想
第二步 设一上限数M,验证 从4到M的所有偶数是否能被 分解为两个素数之和。1.定义一个变量X,初值为4。2.每次令其加2,并验证X能否 被分解为两个素数之和,直到 X不小于M为止。
验证哥德巴赫猜想(续一)
第三步 如何验证X是否能被分解为两个素数之和。1.从P=2开始;
2.判别X—P是否仍为素数:
3.若是,打印该偶数的分解式。
4.否则,换更大的素数,再继续执行2.。如此循环,直到用于检测的素数大X/2且X 与其之差仍不是素数,则打印“哥德巴赫猜想”不成立。
验证哥德巴赫猜想(续二)第四步 生成下一个素数。(1)当前素数P加1
(2)判别P是否是素数;
(3)若是素数,返回P;(4)否则,P加1,继续执行(2)。
验证哥德巴赫猜想(续三)
经过四步分解精化,将“验证哥德巴赫猜想”这个命题已经分解为计算机可以求解的数学模型了。
剩下的问题就是编程求解了。如何编程是程序设计课程要解决的问题。
哥德巴赫猜想算法分析 1)用“筛选”法生成素数表PrimeList[M]。先在素数表中产生0到M-1的所有自然数,然后将已确定的所有素数的倍数置0(求模取余为0)。
2,3,5,7,11,13,17,19,21,23,29,31...2)这样一来,素数表中有许多0,为找下一个素数,要跳过这些0。
3)分解0到M-1之间的所有偶数;
①循环(x
②先取素数P=2,判别 若PrimeList[x-p]等于0,说明分解不成功,p取素数表中下一个素数;再执行②
③若PrimeList[x-p]不等于0,分解成功,打印分解式
④x = x + 2,继续执行①,检查下一个偶数。
程序逻辑功能框图
程序模块结构
程序(生成素数表子函数)#include
#define M
/* 定义验证范围 */ void CreatPrimeList(int PrimeList[]){
int i, j;
for(i=0;i
/* 生成素数表,置初值 */
PrimeList[i] = i;
i = 2;/* i 取初值 2 */
while(i
sqrt(A))。*/
{
for(j=i+1;j
if(PrimeList[j]!=0 PrimeList[j]%PrimeList[i]==0)
PrimeList[j] = 0;
i = NextPrimeNumber(i,PrimeList);/*取下一个素数 */
}
}
&& 求下一个素数子函数 /*----函数 NextPrimeNumber: 求下一个素数-----*/
int NextPrimeNumber(int p, int PrimeList[ ])
{
p = p+1;
while(PrimeList[p]==0)
p = p+1;
return PrimeList[p];
}
主函数 main()
{
int PrimeList[M];
int x, p;
CreatPrimeList(PrimeList);/*生成素数表 */
x = 4;/* 从4到 M 开始验证 */
while(x
{ p = PrimeList[2];/*
第1个素数是2
*/
/* 验证偶数减去一个素数后的余数是否仍为素数 */
while(p
p = NextPrimeNumber(p, PrimeList);
if(p>=M/2)/* 找到一个不能分解为两个素数和的偶数 */
printf(“Great discovery: Goldbahe is wrong!n”);
else /* PrimeList[x-p]≠0 分解成功 */
printf(“The even number %d = %d + %dn”,x,p,x-p);
/* 验证下一个偶数 */
x = x+2;
}
}
面向对象程序设计
基本思想
基本过程
主要特点
面向对象的基本概念
“面向对象“简称为“OO”。这是目前计算机业界使用的高频词。“OO”代表着一种新的思维方式,代表着一种新的程序设计方法的潮流。 什么是OO方法?什么是OOP?
为什么要选择OO方法?
面向对象程序设计基本思想
面向过程的程序设计(Structure Programming)
以功能为中心,采用函数来描述(动词)传统的程序设计方法,出发点是“怎样做(How)?”。
面向对象程序设计(OOP)
面向对象程序设计方法认为,客观世界是由各种各样的实体组成的,这些实体就是面向对象方法中的对象。
消息是向某对象请求服务的一种表达方式
对象之间的交互通过发送消息来实现。
消息包括:目标对象 ,请求的方法 ,参数
什么是面向对象方法 面向对象(OO)方法的出发点是:“是什么(What)?”。
现实世界是由物质组成的,人认识事物的规律:首先是认识问题域(Domain),它“是什么?”,再去认识事物的本质。
“对象”表现现实世界中的某个具体的事物。
传统程序设计方法存在的问题
生产率提高的幅度远不能满足需要
软件重用程度很低
软件维护困难
软件不能真正满足用户的需要
生产率提高幅度远不能满足需要
生命周期方法学强调需求分析的重要性,强调每个阶段结束之前必须进行严格的评审和质量把关。这种“按部就班”式的开发方法效率不高。
据统计资料表明:
从上个世纪的30中,美国软件生产率翻了两翻
但社会对软件需求每年以两位数字的百分比增长
软件的开发,已成为影响计算机应用的巨大桎梏和瓶颈。
软件重用程度很低
“重用”也称“再用”或“复用”。显然,软件重用是节约人力,提高软件生产率的重要途径。
传统的程序设计方法没能很好地解决软件重用问题。建立标准函数库和子程序库是一种低级的可重用的尝试。仅仅限于数学和统计学方面。
对于传统程序设计技术而言,思维成果的可重用性很差。
软件维护困难
按生命周期方法学开发出的软件,维护成本很高,据统计数据表明,软件维护的生产率比软件开发的生产率低几十倍。
80年代,美国一年花费的软件维护费用高达300多亿美元。
90年代,软件维护费用占系统研制、开发总费用的70%~80%。
软件不能真正满足用户的需要
在美国,实践表明,开发出的系统中:
¨符合用户需要并顺利投入使用的系统仅占总数的1/4;
¨¨中途夭折的系统占1/4;
将近1/2的系统,虽然完成了开发过程,但并未被用户采用或并未被长期使用。
还表现在:
开发出的软件系统与用户预期的系所开发出的系统不能适应用户经常统不一致,不能满足用户的需要。
变化的情况,系统的稳定性和可扩充性不能满足要求。
设计方法主观随意性很大
结构化方法采用“自顶向下,逐步求精”进行分解。但因开发人员的经验、知识背景对问题认识的不同,而造成分解的随意性。
即使是对同一个系统,不同的人可能分解出不同的软件结构。
为什么选择面向对象分析法?
更加自然
当系统不断地演化时,内部的功能会变化,但是对象本质不变
面向对象的系统更容易维护
面向对象分析法强调对象间定义良好的界面
OO方法的主要优点
与人类习惯的思维方法一致
稳定性好
可重用性好
可维护性好
与人类习惯的思维方法一致
人的认识过程是从一般到特殊的渐进思维过程,是从“是什么?”开始,认识事物及其本质规律,主观随意性受到限制。
而传统方法是从“怎样做?”开始,到“做什么?”,反认识规律而动,主观随意性太多。
稳定性好
传统方法以“过程为中心”,完全基于功能的分析和分解。当功能需求发生变化时,将引起对软件结构整体的修改,这样的系统是不稳定的。
OO方法以“对象为中心”,它是以对象模拟问题领域中的实体,以对象间的联系描述实体间的联系。在分析、研究对象及其属性的过程中根据其内在的规律建立求解模型。
基于这种方法建立的软件系统,不管功能需求如何变化,其内在规律不变,因而不会引起软件系统结构的整体变化。因此是稳定的。
可重用性好
OO方法中类的继承性是一种代码重用的有效途径。开发者在设计软件的过程中,将一些精心设计、测试过的代码不断加入到已有的类库中。而类库是可供共享的代码库。
因此用OOP开发的软件具有较好的可重用性。
可维护性好
稳定性较好 局部修改,不影响大局,错误不会传播;
易修改 采用封装机制和信息隐藏机制,使其内部实现与外界完全隔离,具有较强的独立性,较好地解决了“软件复杂性控制”问题。
易于阅读、理解 符合人类习惯的思维方法,对原系统所做的修改,往往通过在原有类的基础上派生一些新类即可实现,易于贯通。
易于测试和调试 派生类继承原有类的特性,只需测试新增加的特性即可。
面向对象程序设计基本过程
分析现实世界问题域
建立模型(类属性/方法的确定及类之间关系的确定)
编程建立类数据类型(属性、方法)
用类声明对象,通过对象间传递消息(方法调用)完成预定功能。
OO程序设计四个基本特征
抽象(类)(数据抽象+代码抽象)封装(过程和数据封藏起来)继承(基类和派生类)多态性(虚函数、函数重载)继承性举例
在“人”类中,大学生可以继承“人”和“学生”的特征(继承传递);对于在职研究生既可以继承“学生”特征,又可以继承“教师”特征(多重继承)。
多态性举例
允许不同类的对象对同一个消息做出响应的操作机制。
例如,加法运算,两个时间相加和两个字符串相加,它们操作的内涵是不同的。但是如果把它们作为不同类的对象,进行对象的相加运算,就可以实现“一个接口,多种方法”。
60006程序填空,不要改变与输入输出有关的语句。验证哥德巴赫猜想:任何一个大于6的偶数均可表示为两个素数之和。例如6=3+3,8=3+5,…,18=7+11。素数就是只能被1和自身整除的正整数......
package Excite;import java.util.Scanner;public cla 哥德巴赫猜想 {public static boolean isPrime(int i){int n;boolean flag=true; if(i==1)} flag=false; if(i%n==0){......
#include#include#define MAX 2000using namespace std;int prime[333];//从小到大记录素数void creatPrimeArray(){//筛选法求素数int i,j,n=0; bool is[MAX];//用来标记每......
C语言验证哥德巴赫猜想(100以内)#include "stdafx.h"#include "stdio.h"int (int i){int j;if (i return 0;if (i == 2)return 1;for (j = 2; j {if (i % j == 0)return......
验证哥德巴赫猜想 #include int isprime(int n)/*判断n是否为素数的函数*/ { int j,x; for(j=2;j#include int f(int n) { int i; for(i=2;i......
