输入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;
}