自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(35)
  • 收藏
  • 关注

原创 孤7问题求解Prolog程序

  孤7问题在下面的除式中,我们只知道一个7,要求将这一除式完整地展示出来。这一问题可以归为逻辑推理问题,但需要依靠算术知识进行推理。例如,除数的最高位一定是1,因为我们可以看出除数乘上7后仍然是一个3位数。□7□□□  --------------------------   □□□/□□□□□□□□                □□□□              

2007-11-30 17:58:00 968

原创 排列的枚举与应用-Prolog

 排列的枚举n个元素有n!种排列。例如,当n=3时,123的排列有如下6种:123132213231312321而当n=4时,1234的排列有如下24种:12341243132413421423143221342143231423412413243131243142

2007-11-30 17:51:00 1672 1

原创 Prolog中的表处理谓词

 表处理谓词表元素枚举:member(X,L)其中L为表,X为L中的元素。表元素的枚举可以采用如下递归子句:1、首先列举表的第一个元素 member(X, [X|_]).2、去掉表的第一个元素,对表尾进行递归处理 member(X, [_|L]):-member(X, L).~~~~~~~~~~~~~~~~~~表元素判断:is_member(X,L)在已

2007-11-30 17:50:00 3416

原创 射击问题求解程序-Prolog

 射击问题在一个靶子的不同区域分别标记有从1环到10环的不同分值,某人在一次射击比赛中用10发子弹打出了90环的成绩,问这10次射击取得的分值有哪些可能?设10次射击分别得到的分数为X1, X2, …, X10,则问题就是生成线性方程X1+X2+…+X10=90 (10≥X1, X2, …, X10≥0)的各种可能的解。一般地,我们来解决n个变量的和为Sum,且每一个变

2007-11-30 17:49:00 1136

原创 集合及其运算-prolog

 集合及其运算基本集合运算谓词通常我们用表结构来表示集合。集合与表的差别在于:集合中不容许包含重复元素,例如,[1,2,4,3]是一个集合,而[1,1,2,4,3]不是一个集合,它包含两个1。集合元素的枚举可以采用表元素的枚举谓词member(X, L),而一个元素是否属于集合的判断谓词可以采用表元素的判断谓词is_member(X,L)。(1)表元素的唯一化为了将一个表变

2007-11-30 17:46:00 3764 1

原创 aabbcc本质不同的排列数

 aabbcc本质不同的排列数Stainhaus在其名著《一百个数学问题》中给出了如下问题:“由aabbcc这组字母可以得出90种不同的排列,其中有些如aabcbc、aacbcb、bcbcaa及acacbb之间 并无本质差别,因为c、b互换,则可由第一个排列得出第2个排列,若逆向看第2个排列,可以发现它与第三个排列等价;而在第3个排列中,若将a、b互换,则生成第4个排列,我们将这种

2007-11-30 17:45:00 4826

原创 子集枚举问题求解-Prolog

 子集枚举由n个元素构成的集合有2^n个子集,例如,集合{1,2,3}的子集有:空集:1个     {}一元子集:3个     {1},{2},{3}二元子集:3个     {1,2},{1,3},{2,3}三元子集:1个     {1,2,3}共8个子集。下面我们考虑一个集合S的所有子集的枚举方法。首先,空集仅有一个子集,即空集本身。其次,当S非空集时,我

2007-11-30 17:43:00 2421

原创 复整数乘法的计算方法

 复整数乘法的计算方法两个复整数乘法的计算公式为(x1+y1i)*(x2+y2i)=(x1*x2-y1*y2)+(x1*y2+x2*y1)i上述公式用4次实整数的乘法完成一次复整数乘法。但这是必须的吗?如果存在3次乘法或2次乘法就可以完成两个复整数的乘法运算,如何才能设计出这种奇妙的推算关系呢?显然,在已知x1*x2, y1*y2以及(x1+x2)*(y1+y2)的情况下,可以

2007-11-30 17:42:00 3160 1

原创 万能算术运算

万能算术运算在《仅用减法及倒数运算实现所有算术运算》一文中我们给出了仅仅利用减法及倒数运算实现加、乘、除等所有算术运算的方法,本文中我们进一步设计一种唯一的二元运算,由其可以导出所有加减乘除运算。定义二元运算x#y如下: x#y=(xy-x+y)/xy  (1)或者等价地有 x#y=1+1/x-1/y  (2)二元运算#的定义域为x,y!=0,响应的程序为:sharp(x,y){ assert(x

2007-11-30 17:39:00 868

原创 仅用减法及倒数运算实现所有算术运算

仅用减法及倒数运算实现所有算术运算给出减法及倒数运算,如何实现加、减、乘、除等运算?定义减法运算如下:sub(x, y){   return x-y;}定义倒数运算如下:recip(x){ assert(x != 0); return 1/x;}其中倒数运算的定义域为x!=0的数(具体是整数还是浮点数等我们不加探讨)。 ~~~~~~~~~~~~~~~加法的推导由于 x+y=x-(-y)且 -y=0

2007-11-30 17:36:00 1538

原创 歧路亡羊——关于组合爆炸的古老预言

 歧路亡羊——关于组合爆炸的古老语言《列子》中有一篇关于《歧路亡羊》的预言:杨子之邻人亡羊,既率其党,又请杨子之竖追之。杨子曰:“嘻!亡一羊,何追之者众?”邻人曰:“多歧路。”既反,问:“获羊乎?”曰:“亡之矣。”曰:“奚亡之?”曰:“歧路之中又有歧焉,吾不知所之,所以反也。”杨子戚然变容,不言者移时,不笑者竟日。门人怪之,请曰:“羊,贱畜,又非夫子之有,而损言笑者,何哉?”杨子不答,门人不获所命

2007-11-16 15:03:00 1058 1

原创 上升数列的生成算法

上升数列的生成算法Martin Garder在《矩阵博士的魔法数》一书中给出了如下一个问题:在12356789之间插入若干个加、减符号,使得其结果正好等于100。请找出问题全部的解。任何两个相邻数之间可以插入+、-运算符之一,也可以不插入任何运算符。对于后一种特殊情况,我们引入一个特殊操作符$,a$b表示a、b之间不插入+、-操作符,其定义为a$b = 10a+b$运算满足结合律a$(b$

2007-11-16 14:52:00 931

原创 数组最大-最小元素的查找算法

数组最大-最小元素的查找算法给定数组A[0...n-1],要求找出A中元素的最大值Max和最小值Min。求最大值和最小值的程序为:// Program Min// Purpose: 求数组元素的最小值int Min(int *A, int nSize){ int k; int nMin; nMin = A[0]; for (k = 1; k   if (A[k]  return nMi

2007-11-16 14:32:00 3592 1

原创 旅馆房间门的着色算法

旅馆房间门的着色有一由8个房间组成的圆形旅馆,没有房间号码。经理别出心裁,想将门分别着上蓝色或者黄色之一,将这8个房间分开来,问怎样对门进行着色可以达到要求?考虑8个门的一种着色分案a[0] a[1] …a[7],若门着黄色,则相应的a[i]=0,着兰色,则a[i]=1。显然只根据一个门的频色是无法将它同其它房间区分开来的,根据两个门的颜色也不可能区分开八个房间,因为两种颜色的2组合仅有4种可

2007-11-16 14:26:00 718

原创 块交换问题算法设计与分析

块交换问题对于长度为m+n的数组(m,n均为正整数),编制程序,将数组的前m个数与后n个数进行变换,要求不能使用另外的数组。例如,对于m=4,n=6,长为10的数组:(0 1 2 3 4 5 6 7 8 9),变换后的结果为:(4, 5, 6, 7, 8, 9, 0, 1, 2, 3)。1、循环移位块交换算法通过m次循环左移或n次循环右移可以完成数组元素交换任务,每次循环移位需执行m+

2007-11-16 14:18:00 846

原创 阶乘数未尾零的个数

阶乘数未尾零的个数n!未尾共有多少个零?编制程序对于n=100,1000,10000解决上述问题。设n!素因子表示中素数p的幂为Pof(n,p) ,则Pof(n,p)=[n/p]+[n/p^2]+……显然Pof(n,5)所以,n!未尾零的个数为Pof(n,5)。例如,Pof(100,5)=[100/5]+[100/25]=20+4=24Pof(1000,5)=[1000/5]+[1000/25

2007-11-16 13:58:00 1106

原创 黑白图象中黑点数的计算方法

黑白图象中黑点数在二值图象处理应用程序的设计中,常常需要统计图象中每一行的黑象素数。对于一幅宽为Width,高为Height的图象,数组Dots用于存放每行的黑象素数。下面的程序中,CalcRowDots计算图像Image中每行黑象素数,ByteDots计算字节k中黑象素数。void CalcRowDots(int *Dots, unsigned char far *Image, int Wi

2007-11-16 13:53:00 1915

原创 计算π的一组公式

计算π的一组公式由tan(π/4-arctan1/k)=(k-1)/(k+1)可以得到:π/4=arctan1/k+arctan(k-1)/(k+1)同理,由tan(π/4-2arctan1/k)=(k^2-2k-1)/(k^2+2k-1)可得:π/4=2arctan1/k+arctan(k^2-2k-1)/(k^2+2k-1)由tan(π/4-3arctan1/k)=(k^3-3k^2-3k

2007-11-16 13:50:00 8651 1

原创 C语言常规优化策略——参数传递、宏定义、全局变量与汇编

C语言常规优化策略4 参数传递、宏定义、全局变量与汇编按照结构化程序设计的原则,一种语言,如果具有赋值、选择与循环三种结构,并严格按照这三种结构来组织程序,避免使用象goto语句这类使程序控制发生跳转的语言成分,在每一个程序块(如选择块、循环块)中保持单向的输入流和输出流,写出的程序就算是结构化的程序,因此,前面三节有关赋值语句、条件语句和循环语句的优化策略对于采用其它结构程序

2007-11-16 08:39:00 5021

原创 C语言常规优化策略——循环优化

C语言常规优化策略3 循环优化提高程序效率的核心是对影响代码执行速度的关键程序段进行优化。在任何程序中,最影响代码速度的往往是循环语句,特别是多层嵌套的循环语句。因此,掌握循环优化的各种实用技术是提高程序效率的利器,也是一个高水平程序必须具备的基本功。本节有关各种循环优化技术的讨论基本上以下面的一个程序段为对象,程序的涵义为:对于两个给定的数组a、b,计算a[8]b[8]+a[

2007-11-16 08:34:00 4500 2

原创 讨论C语言常规优化策略——条件语句优化

C语言常规优化策略2 条件语句优化2.1 多分枝条件语句优化多分枝条件语句一般采用switch语句,这样的程序无论从清晰性和效率上都比原来的程序要好。例如下面的函数采用三种函数形式分别计算x在Alpha,Beta和Gamma处的值,通常的写法为:int  f(int x){ int  y; if (x==Alpha)  y=f1(x); else   if (x==Beta)   

2007-11-16 08:31:00 1957

原创 C语言常规优化策略--赋值语句优化

C语言常规优化策略从理论上讲,程序的优化一般分为局部优化、循环优化和全局优化三个层次。所谓局部优化,重点在于删除程序中的无用赋值,利用语言的特性对基本赋值语句优化,局部优化一般不宜过多采用,但如果程序中总是有一些无效赋值或没有引用的变量,这可能给别人造成幼稚的印象;循环优化和全局优化往往能大幅提升程序效率,因此有关的技术对于高质量的程序设计是至关重要的。本文讨论C语言程序常规优化策略,其重

2007-11-16 08:28:00 2863

原创 路径数的计算

路径数的计算问题:编制程序,计算从点A(0,0)到点B(m,n)的路径数。行走方向只能向上或向右。+--+--+--+--+--+B(m,n)|  |  |  |  |  |+--+--+--+--+--+|  |  |  |  |  |+--+--+--+--+--+|  |  |  |  |  |+--+--+--+--+--+A(0,0)一条从A到B的路径将有m次向右行走和n次向上行走。

2007-11-16 08:22:00 3714

原创 Ramanujan-Nagell方程求解程序

Ramanujan-Nagell方程求解程序 M. B. Nathanson所著《Elementary Methods in Number Theory》第42页给出了下面一个问题:当x当x在实际的程序中,我们判断n在[3,30]之内的所有可能的解。n   2^n     n       2^n1   2        17     1310722   4       18      2621

2007-11-16 08:19:00 635

原创 Ljunggren方程解的搜寻

 Ljunggren方程M. B. Nathanson所著《Elementary Methods in Number Theory》第42页给出了下面一个问题:“确定Ljunggren方程x2-2y4=-1在x≤1000内的所有可能的整数解。”这一问题可以通过设计程序解决。因为4次方数比平方数要稀疏,我们可以从变量y着手来设计问题求解程序。为了在更大范围内寻找问题可能的解,我们限制1≤

2007-11-15 17:50:00 355

原创 生成Farry序列的Prolog程序

 生成Farry序列的Prolog程序设n为正整数,n阶Farey序列为[0,1]区间内所有分母小于或等于n的所有有理数递增排列所构成的序列。记0=0/1,1=1/1,Fn为n阶Farey序列,则1~7阶的Farey序列为:{0/1,1/1}{0/1,1/2,1/1}{0/1,1/3,1/2,2/3,1/1}{0/1,1/4,1/3,1/2,2/3,3/4,1/1}{0

2007-11-15 17:46:00 797

原创 马的棋盘遍历的一个近似算法

 马的棋盘遍历的近似算法国际象棋中的马的遍历问题为:国际象棋中的马能否按照马步访问每一格点一次,最后再回到原地?由于国际象棋中的马又称为骑士,国际象棋中的马的遍历问题也称为骑士遍历问题。在国际象棋棋盘中,骑士在选择下一个环游点时,共有8种可能的方案(如图所示)。除开其中已经游历的格点和棋盘外的格点,骑士一般还存在多种方案可供选择。对于每一个候选的格点,与之马步相连而还没有游历的棋盘内格

2007-11-15 17:36:00 1647

原创 阶乘数的快速计算方法

 阶乘数的快速计算方法如何快速计算阶乘数n!?一种简单的办法是采用下面的循环:fac=1;for (k=2;k  fac*= k;最后的fac值即为n!的值。当然,当n较大,n!超过计算机字长表示范围时,可以采用多精度算术进行计算。事实上有一种更高效的问题求解方法,其思路是:首先将n!分解为唯一的素因子的乘积形式,然后,对该乘积进行适当优化,例如,10!=2^8*3^4

2007-11-15 17:22:00 16250

原创 一般线性递归函数的伪递归优化方法

 一般线性递归函数的伪递归优化方法一般地,对于线性递归函数f[n]=b[1]f[n-1]+b[2]f[n-2]+...+b[k]f[n-k]  (n>k)f[1],f[2],...,f[k]已知。 用a[1..k]记录f[1]到f[k]的值。其递归计算程序为:// Program ReFun_0.cint f(int n, int *a, int *b, int

2007-11-15 17:05:00 600

原创 问题:飞行调度难题

 飞行调度难题有一组飞机,其中的每架飞机加满油时可绕地球飞行五分之一的距离,而每架飞机都可以从另外一架飞机加油。假设所有的飞机飞行速度都相同,为常速,耗油率也相同,还假定基地是飞机唯一着陆地点和地面加油地点,加油时间可以忽略。现在要求使得一架飞机能绕地球一圈,而其它飞机全部安全返航,试问这队飞机至少需要多少架? 

2007-11-15 16:50:00 606

原创 大菲波那契数的计算程序

 大菲波那契数的计算程序对于较大的n,由于f[n]已超过计算机字长所能表示的范围,如何利用计算机来精确地生成的f[n]值呢?例如,当n=100时,f[1000]的值大大超过了无符号长整数所能表示的范围,很多对程序设计已有相当多经验的程序员对此不知所措。事实上这一问题的解决非常简单,设想让我们用纸和笔来计算f[100],所要做的无非是反复进行多位数的加法,如果我们将每位数用数组的一个单元

2007-11-15 16:48:00 581

原创 链表元素求和的伪递归优化

 链表元素求和的伪递归优化递归程序优化的一种广泛采用的技术是将递归程序转换为尾递归程序。所谓尾递归程序,是指程序仅仅在程序的最后一条语句才调用自身的程序。对于这类程序,已经开发出强有力的编译技术来加快程序的执行速度。举一个简单的例子来说明将递归程序转化为尾递归程序的思想,该程序用于统计一个链表中各项元素值的和,通常的递归程序为:// Program ListSum_0typedef

2007-11-15 16:43:00 770

原创 小菲波那契数的计算程序

 小菲波那契数的计算程序刚开始写程序的人往往不愿意对问题进行细致的分析,他们喜欢多用一些空间来表示问题的结构,从而简化程序的控制部分。为计算菲波那契数,定义一个数组f,f[i]用于存放第i项菲波那契数。一个初学者的程序看起来可能是下面的样子:// Program: Fib_0#define MAX_SIZE          20 int Fib(int n){  

2007-11-15 16:40:00 519

原创 二分求幂与伪递归优化

 二分求幂与伪递归优化对于许多问题求解来说,设计相应的递归程序是非常自然的事。例如,对于计算实数x的n次幂这一任务,一种高效求解算法的递归设计思想可表示如下:记x的n次幂为P,若n为偶数,记y=x*x, P等于y的n/2次幂;若n为奇数,计算x的n-1次幂,结果记为P1,则P=x*P1。相应的递归程序为:double power(double x, int n){   

2007-11-15 16:37:00 777

原创 二十四点游戏求解算法设计

 二十四点游戏问题给定4个10以内的正数,要求使用加、减、乘、除运算得到24,其中每一数必须用到一次, 而最多也只能用一次。例如,给定的四个数为6、8、8、9,则              8*9-8*6=24这一游戏可以采用扑克牌来玩。如果事先将花牌全部抽走,数的范围就限制在1到10之间;加上花牌一起玩时,一般将J作为11,Q作12,K作13。从趣味性来看,抽走花牌要好完

2007-11-15 16:32:00 2668 2

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除