有一种数叫做最大公约数

       今日,不知何时来了兴趣,突然想翻一翻大一学生的Java书籍。书写得还可以,唯独少了那一份心血澎湃,多了一份审视的眼光。

       在封装的某个章节里,突然遇到关于1/3+1/3等有理数的运算问题。遇到这类的问题,最近往往都不是追求算法的目标,而是以设计者的角度重新看待问题。“横看成岭侧成峰”,每个阶段,每一种阅历,都将导致对事务的看法都所不一,所以我决定从所谓的封装角度去看待它,设计它,让它得以优化,以满足对一个设计者的独特强迫症。

       有理数的运算,默认都是将运算的结果作为近似小数进行表示,往往这种做法就不能满足我们的需求,以有理数的存在正是我们想要的结果。java没有这样的类库,那我们就开始创造哈,毕竟创造才是我们的动力。于是乎,敲敲想想只际,写写停停的过程中,利用到了最大公约数的知识,想想自己隐隐约约有这方面的知识,但是并不是很清楚。趁着这个需求,顺便复习一下以前的知识,正所谓“温故而知新,可以为师矣”。

     通过复习,感觉对最大公约数的知识有了更清楚的理解和认知,虽然称不上“可以为师矣”的程度,但是还是可以让自己受益匪浅。下面是是我通过学习后的总结,希望能帮助你们。thank,goodness...

1、最大公约数,是指若干个约数中最大的一个,公约数是指N个数中每一个数都有相同的因子,这些因子就称为公约数。例如6/3,6的因子有1,2,3,6,3的因子有1,3,所以他们共有的因子是1,3,其中,最大的就是3!

a能被b整除,是说a是被除数,可以被c,d或者其他书的整除,所以它是被除数a;而b是除数,可以除很多数的。表达形式为:a/b,b是a,b中的最大公约数,a是最小公倍数!换而言之,b能整除a,a能被b整除是一样的。

关于求解最大公约数的办法有:

(1)质因数分解法:把每一个数分解成质因数,然后再把共有的质因子全部相乘,即可得到最大公约数。

         例如:(20,60)的最大公约数为20,即每个数全部分解成质因子

                 (1) 20 = 2*2*5 ;(2)60=2*2*3*5

共有的因子为:2,2,5,将所有因子全部相乘,2*2*5=20,所以20是他们的最大公约数。

(2)短除法

(3)辗转相除法:1.小数放前面,方法:先比较两个数的大小,如果第一个数要比第二个数要小,就交换他们。                                   否则不用交换;

                               2.经过第一步的处理后,确保第一个数要比第二个数要大,于是就将第一个数模第二个数,末                                   后的结果如果不为零,那么进行辗转,即把b当成a,余数当成b,然后再模,直至零为止。

        注意: 交换辗转相除法是求两个自然数的最大公约数的一种方法,也叫欧几里德算法。

        例如 :求(319,377)

                    ∵ 319÷377=0(余319)

                    ∴(319,377)=(377,319);

                    ∵ 377÷319=1(余58)

                   ∴(377,319)=(319,58);

                   ∵ 319÷58=5(余29)

                  ∴ (319,58)=(58,29);

                 ∵ 58÷29=2(余0)

                 ∴ (58,29)= 29;

                ∴ (319,377)=29。


代码的描述如下:

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容