今日,不知何时来了兴趣,突然想翻一翻大一学生的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。
代码的描述如下: