公约数和公倍数

求最小公倍数算法

最小公倍数=两整数的乘积÷最大公约数

求最大公约数算法

(1)辗转相除法

有两整数ab

① a%b得余数c

② c=0,则b即为两数的最大公约数

③ 若c≠0,则a=bb=c,再回去执行①

/*
求最小公倍数算法:

最小公倍数=两整数的乘积÷最大公约数
求最大公约数算法:
(1)辗转相除法
有两整数a和b:
① a%b得余数c
② 若c=0,则b即为两数的最大公约数
③ 若c≠0,则a=b,b=c,再回去执行①
*/

#include <stdio.h>

int common_divisor_func(int num1, int num2);

int main()
{
    int n;
    int num1, num2;
    int common_divisor, common_multiple;
    scanf("%d", &n);
    while(n--)
    {
        scanf("%d%d", &num1, &num2);
        common_divisor = common_divisor_func(num1, num2);
        common_multiple = num1 * num2 / common_divisor;
        printf("%d %d
", common_divisor, common_multiple);
    }
    getchar();
    return 0;
}

int common_divisor_func(int num1, int num2)
{
    int c;
    int tmp;
    c = num1 % num2;
    while(num2 != 0)
    {
        c = num1 % num2;
        num1 = num2;
        num2 = c;
    }

    return num1;
}
//比较递归计算最小公倍数
//注意必须a > b

int gcd(int a, int b)
{
    if(b == 0)
    {
        return a;
    }
    else
    {
        return gcd(b, a % b);
    }
}

这个算法看起来其实并不是很难,但是到了实际应用的时候可能要考虑很多的东西,比如两个很大的数的最小公倍数有可能已经超出了int的范围了,这个时候就要使用long long或者__int了

还有那个

common_multiple = num1 * num2 / common_divisor;

有的时候可以先除后乘。



计算一个数的所有的约数
int arr[100];
int i;
for(i = 0;i * i < sqrt(num);i++)
{
    if(num % i == 0)
    {
        arr[top++] = i;
        srr[top++] = num / i;
    }
}


原文地址:https://www.cnblogs.com/virusdefender/p/3384895.html