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,temp1,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
if(temp < low)//比较两个数大小并交换
begin
temp1 = temp;
temp = low;
low = temp1;
end
temp=temp-low;
end
yue = temp;
end
end
endmodule
对于最小公倍数,首先要求出最大公约数,然后由下面的公式求出最小公倍数:
lcm = a * b / gcd(a,b)
即a与b的乘积除以最大公约数;