摘要:该文出自于编程之美中关于最大公约数问题一章。任意给定两个数字,得到其最大公约数 GCD(greatest common divisor),如果两个数字都很大怎么解决。分析:最大公约数早在公元前300年,欧几里得的《几何原本》里就提出了一个高效率算法---辗转相除法。解法一:假设f(x,y)表示x,y...
阅读全文
摘要:什么是GCD?GCD是最大公约数的简称(当然理解为我们伟大的党也未尝不可)。在开头,我们先下几个定义:①a|b表示a能整除b(a是b的约数)②a mod b表示a-[a/b]b([a/b]在Pascal中相当于a div b)③gcd(a,b)表示a和b的最大公约数④a和b的线性组合表示ax+by(x,y为整数)。我们有:若d|a且d|b,则d|ax+by(这很重要!)线性组合与GCD现在我们证明一个重要的定理:gcd(a,b)是a和b的最小的正线性组合。证明:设gcd(a,b)为d,a和b的最小的正线性组合为s∵d|a且d|b,∴d|s。而a mod s=a-[a/s]s =a-[a/s](
阅读全文
摘要:<1> 用辗转相除法求最大公约数 算法描述: m对n求余为a, 若a不等于0 则 m <- n, n <- a, 继续求余 否则 n 为最大公约数 <2> 最小公倍数 = 两个数的积 / 最大公约数
阅读全文
摘要:Catalan数 中文:卡特兰数 原理: 令h(1)=1,h(0)=1,catalan数满足递归式: h(n)= h(1)*h(n-1) + h(2)*h(n-2) + ... + h(n-1)h(1) (其中n>=2) 另类递归式: h(n)=((4*n-2)/(n+1))*h(n-1); 该递推关系的解为: h(n+1)=C(2n,n)/(n+1) (n=1,2,3,...) 我并不关心其解是怎么求出来的,我只想知道怎么用catalan数分析问题。 我总结了一下,最典型的四类应用:(实质上却都一样,无非是递归等式的应用,就看你能不能分解问题写出递归式了) 1.括号化问题。 矩阵链乘:
阅读全文
摘要:在组合数学,Stirling数可指两类数,都是由18世纪数学家James Stirling提出的。Stirling数有两种,第一类和第二类Stirling数,它们自18世纪以来一直吸引许多数学家的兴趣,如欧拉、柯西、西尔沃斯特和凯莱等。后来哥本哈根(Copenhagen)大学的尼尔森(Niels Nielsen,1865-1931)提出了"Stirlingschen Zahlen erster Art" [第一类Stirling数]和"Stirlingschen Zahlen zweiter Art" [第二类Stirling数],首次把这两类数冠以「S
阅读全文
摘要:无论是用链表实现还是用数组实现都有一个共同点:要模拟整个游戏过程,不仅程序写起来比较烦,而且时间复杂度高达O(nm),当n,m非常大(例如上百万,上千万)的时候,几乎是没有办法在短时间内出结果的。我们注意到原问题仅仅是要求出最后的胜利者的序号,而不是要读者模拟整个过程。因此如果要追求效率,就要打破常规,实施一点数学策略。为了讨论方便,先把问题稍微改变一下,并不影响原意:问题描述:n个人(编号0~(n-1)),从0开始报数,报到(m-1)的退出,剩下的人继续从0开始报数。求胜利者的编号。我们知道第一个人(编号一定是m%n-1) 出列之后,剩下的n-1个人组成了一个新的约瑟夫环(以编号为k=m%n
阅读全文
摘要:斐波那契数列的发明者,是意大利数学家列昂纳多·斐波那契(Leonardo Fibonacci,生于公元1170年,卒于1240年,籍贯大概是比萨)。他被人称作“比萨的列昂纳多”。1202年,他撰写了《珠算原理》(Liber Abacci)一书。他是第一个研究了印度和阿拉伯数学理论的欧洲人。他的父亲被比萨的一家商业团体聘任为外交领事,派驻地点相当于今日的阿尔及利亚地区,列昂纳多因此得以在一个阿拉伯老师的指导下研究数学。他还曾在埃及、叙利亚、希腊、西西里和普罗旺斯研究数学。 斐波那契数列通项公式斐波那契数列指的是这样一个数列:1、1、2、3、5、8、13、21、…… 这个数列从第三项开始
阅读全文
摘要:自从转载了来自圣经的算法一文后,就想把这些算法比较详细地搞清楚,先拿辗转相除法开刀了,谁让她最简单呢。呵呵。 下面的大部分内容来自维基百科。 辗转相除法,又被称为欧几里德(Euclidean)算法, 是求最大公约数的算法。辗转相除法首次出现于欧几里得的《几何原本》(第VII卷,命题i和ii)中,而在中国则可以追溯至东汉出现的《九章算术》。 两个数的最大公约数是指能同时整除它们的最大正整数。辗转相除法的基本原理是:两个数的最大公约数等于它们中较小的数和两数之差的最大公约数。例如,252和105的最大公约数是21(252 = 21 × 12;105 = 21 × 5);因为25
阅读全文
摘要:一、无限循环小数怎样化为分数? 公式 第一种: 这个公式必须将循环节的开头放在十分位。若不是可将原数乘10^x(x为正整数) 就为:12.121212……-0.121212……=12 100倍 - 1倍 =99 (99和12之间一条分数线) 此公式需用两位数字,其中两位数差出一个循环节。 再举一个例子:0.00121212…… 公式就变为:1212.121212……-12.121212……=1200 100000 倍 - 1000倍 =99000 (1200与99000之间一条分数线) 第一行为原数的的倍数10^x(x为正整数),第二行为与原数的乘数,10^x(x为正整数)。 第二种: 如,将
阅读全文