題目:C實現最大公約數和最小公倍數。
分析:
原文鏈接:http://www.baidu.com/p/csg974?from=zhidao
反過來從已知兩個整數思考,
拿30和18舉例,分解質因數,
30=2*3*5
18=2*3*3
兩者相同的部分是2*3,不同的部分是5和3。
所謂的最大公約數,就是指的這個相同的部分,它同時被兩個整數包含在內,是兩個整數共同的約數,所以是公約數,而且是最大的那個,因為你把所有相同的部分都取出來了。
所以30和18的最大公約數就是2*3=6。
而最小公倍數是什麼呢,是兩個整數的共有的倍數,就是既能包括第一個整數,也能包括第二個整數。
那麼怎樣包含呢?首先兩者相同的部分2*3必須算上,然後要包含第一個整數,那就必須再算上兩者不同的部分5,要包含第二個整數,就要包含第二個整數的那個不同的部分3。
所以最小公倍數就是最大公約數(相同部分)*第一個數的不同部分*第二個數的不同部分。這樣就可以被兩個整數同時整除了。而且也是最小的公倍數,再比它少一點就不能被某個整數整除了。
當然,兩個整數相乘的話,也是公倍數,但這樣相同部分就乘了2次,所以不是最小的。只有當兩個整數最大公約數為1即互質的時候,就沒有相同部分了,這時乘積就是最小公倍數。
所以回頭看你這個題目。
最小公倍數÷最大公約數,結果就是算出兩者不同的那部分。
然後把這個不同的部分分成兩部分的乘積,再分別乘到最大公約數上,
就算出這兩個整數。
要注意的是,把那個不同部分分成兩部分的時候,不要把同樣的質因數分到兩邊。
比如說不同的部分是3*5*5,那你就不能分成3*5和5,因為這樣5就屬於相同部分了,不屬於不同部分,那樣最大公約數和最小公倍數就變了,不可以的。
只能分成1和3*5*5,3和5*5。總之讓相同的質因數放在相同的一邊就好。
代碼實現:
#include<stdio.h> #include<math.h> printf( scanf(,&n1,& total=n1* (n1< temp= n1= n2= ((a=(n1%n2)!= n1= n2= printf( printf(,total/ }
結果截圖: