输入2个整数,然后生成最大公约数和最小公倍数的函数void gcd(int x,int y,int*lcm,int*p gcd)。最大公约数用欧几里得的方法计算。
问题描述:
void gcd( int x, int y, int* p_lcm ,int* p_gcd)
最大公约数用欧几里得的方法计算。
欧几里德的方法是用一个大数反复除以小数的方法!
- 最小公倍数计算如下:=> lcm=(x*y))gcd
输入两个数:24 36
最小公约数(lcm):72
最大公约数(gcd):12
.。。。。。。
答
所谓“欧几里得的方法”,其实我国汉朝也有,记载在九章算术里,叫做“碾转相除法”。
#include <stdio.h>
void gcd(int x,int y,int*plcm,int*pgcd)
{
int x1=x;
int y1=y;
while (*pgcd = x % y){
x = y;
y = *pgcd;
}
*pgcd = y;
*plcm = x1 * y1 / *pgcd;
}
int main()
{
printf("输入两个数:");
int x, y;
scanf("%d%d", &x, &y);
int l, g;
gcd(x,y,&l,&g);
printf("最小公倍数(lcm):%d\n最大公约数(gcd):%d", l, g);
return 0;
}
答
算法解析:
calc_gcd计算最大公约数,b为0时,最大公约数为a,否则b除以a的余数。a和b的最大公约数就余数和a的最大公约数。
通过递归,直到余数为0,得到最大公约数。
*p_lcm = x * y / (*p_gcd); 使用最大公约数,计算最小公倍数。
#include <stdio.h>
int calc_gcd(int a, int b){
if (b == 0) return a;
return calc_gcd(b,a%b);
}
void gcd(int x, int y, int* p_lcm, int* p_gcd)
{
*p_gcd = calc_gcd(x,y);
*p_lcm = x * y / (*p_gcd);
}
int main(int argc, char *argv[])
{
int input_x, input_y;
int int_lcm, int_gcd;
printf("2개의정수를입력하시오:");
scanf("%d%d", &input_x, &input_y);
gcd(input_x,input_y,&int_lcm,&int_gcd);
printf("최소공배수(lcm):%d \r\n",int_lcm);
printf("최대공약수(gcd):%d \r\n",int_gcd);
return 0;
}