1.最大公約數(最大公因數)就是幾個數公有的因數中最大的一個
例:12與18 12的因數有1,12,2,6,3,4
18的因數有1,18,2,9,6,3
公有的因數有1,2,3,6, 所以6就是12與18的最大公約數.
而求最大公約數的方法可以總結爲:
①先判斷兩個數的大小,如果兩數相等,則這個數本身就 是就是它的最大公約數。
②如果不相等,則用大數減去小數,然後用這個較小數與它們相減的結果相比較,如果相等,則這個差就是它們的最大公約數,而如果不相等,則繼續執行②操作。
解法分析(更相減損法):
例如: 有兩個數 12 18,它們的最大公約數爲6
12 = 6 * a—————–12肯定是它最大公約數的倍數
18 = 6 * b—————–18也肯定是它最大公約數的倍數
18 - 12 = 6 *(b - a)——由結果可看出它們的差值肯定也是最大公約數的倍數
12 - 6 = 6 ————-直到減數和差值相同時,則這個相同的數就是它們的最大公約數。(其原理就是用兩個數相等時,它本身就是最大公約數,因爲,除去第一次相減,其餘的每次減法都是用減數和差值相減,當然了,這僅僅是個人的看法,感覺這樣可以好理解一點)
module yueshu(clk,rst_n,a,b,yue);
input clk,rst_n;
input [7:0] a,b;
output reg [7:0] yue;//最大公約數肯定不會超過輸入數據
reg [7:0] temp,low;
always @(a,b)
begin
if(~rst_n)
begin
yue <= 'd0;
end
else
begin
low=(a>=b)?b:a;//判斷小的數
temp=(a>=b)?(a-b):(b-a);
while(temp != low)
begin
low =(low > temp)?temp:low;
temp=temp-low;
end
yue = temp;
end
end
endmodule
對於最小公倍數,首先要求出最大公約數,然後由下面的公式求出最小公倍數:
lcm = a * b / gcd(a,b)
即a與b的乘積除以最大公約數;