数论相关知识及其算法(上)

      做ACM学习笔记的初衷主要是为了督促自己能好好利用空闲的时间看一下算法。尽管自己不参加ACM竞赛也从来没在OJ上刷过ACM题,但总觉得算法对于做软件开发这一行的人来说还是至关重要的内容。像组成原理、操作系统、计算机网络、数据结构和算法等等,自我感觉学好这些基础知识比学好一门编程语言更重要,也难怪计算机研究生考试会拿这几门来进行测试,这些知识的重要性可见一斑。从功利性的角度来看,学好算法出去找工作薪水会更高,刚毕业的大学生如果说获得过ACM国际大赛的奖项,那年薪20w是有的吧。对于我来说也只能yy一下了,但人各有志,每个人都有自己的爱好,专注自己所爱的相信一定会有所收获。

      最初是打算研究《算法导论》的,但是发现里面讲的内容很深,各种推倒和定理,看得有点晕,不太合我的口味。所以打算先选择一些简单的书籍初步了解一下,之后再去啃那本书。个人觉得可以先找一些讲解ACM题的书看一看,当然是一些很简单的题,可以加深一下对基础题的训练,取得一点成就感什么的,再慢慢加深难度,看一些理论性很强的算法书。鉴于我参考的这本书是从数论开始讲起的,我也就先从这一块开始了。以下是引用书中对数论的解释:

      数论是研究整数性质的一门很古老的数学分支,其初等部分是以整数的整除性为中心,包括整除性、不定方程、同余式、连分数、素数分布及数论函数等内容,统称初等数论。初等数论不需要求助于其他数学学科的帮助,只依靠初等的方法来研究整数性质。由于计算机对整数的处理能力比对非整数要强得多,因此,自从有了程序设计竞赛,数论题目就频繁出现于竞赛题目之中。一般来说,数论方面的题目在程序的编写方面不会太复杂,但若是缺少相关的知识,对于很多题目也只能一筹莫展。

      1. 整除

      在数论中,一个整数a能被另一个整数d整除,记做d|a。如果d|a且d>0,则我们说d是a的约数。整除有如下性质:

      1)如果d|a, 则对于任意整数k有d|ka;

      2)如果d|a且d|b,则d|(a+b)或d|(a-b);

      3)如果b|a且a|b,则a=b。

      2. 最大公约数

      如果d是a的约数且也是b的约数,则d是a与b的公约数,而最大公约数则是所有公约数中最大的那个。一般,我们将整数a与b的最大公约数记为gcd(a,b)。

      同样最大公约数也有一些性质,其中有一个性质比较重要:

      如果q和r是a除以b的商和余数,即a=bxq+r,则gcd(a,b)=gcd(b,r)。

      3. 最小公倍数

      如果m是a的倍数并且也是b的倍数,则m是a与b的公倍数,而最小公倍数则是所有公倍数中最小的那个。记为lcm(a,b)。

      最小公倍数有如下性质:

            lcm(a,b)=axb/gcd(a,b)

     4. 编程求解最大公约数和最小公倍数

      说了这么多性质我们再来看看一个很常见的编程题,即求最大公约数和最小公倍数。

      利用上面提到的最大公约数性质,我们可以采用辗转相除法来求两个整数的最大公约数,最大公约数求出来利用最小公倍数的性质即可求出最小公倍数。例如:

         gcd(1001,767)

      = gcd(767, 234) // 234 = 1001 % 767;

      = gcd(234, 65) = ... = gcd(13,0) = 13

      当然求两个数的最大公约数也可以采用欧几里得方法:只要两个数不相等,则反复用大数减小数,直到相等为止,此相等的数就是两个数的最大公约数。其实这种方法跟上述的方法是类似的,都是利用了最大公约数的性质。

      

转载于:https://www.cnblogs.com/blacksword/archive/2012/03/02/2377294.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值