pta最大公约数和最小公倍数

本文介绍了一个简单的C语言程序,该程序用于计算并输出两个给定正整数的最大公约数和最小公倍数。输入为两个正整数M和N,输出为它们的最大公约数和最小公倍数。

本题要求两个给定正整数的最大公约数和最小公倍数。

输入格式:
输入在一行中给出两个正整数M和N(≤1000)。

输出格式:
在一行中顺序输出M和N的最大公约数和最小公倍数,两数字间以1空格分隔。

输入样例:

511 292

输出样例:

73 2044

#include <stdio.h>

int m, n;
int max, min;
int a;

int main()
{
    scanf("%d %d", &m, &n);
    
    a = m;
    for (;;a--)
    {
        if ((m % a == 0) && (n % a == 0))
        {
            max = a;
            break;
        }   
    }
    min = m * n / max;

    printf("%d %d", max, min);
    
    return 0;
}
PTA平台上解决最大公约数最小公倍数问题,有多种解决方案。 可以使用辗转相除法,思路是找到两数之间较大的数a对较小的数b取模,得到余数c,接着再用b对c取模,反复操作直到最后余数为0,最后取模的那个数就是最大公约数。得到最大公约数后,根据两数之积等于它们的最大公约数最小公倍数的乘积,可计算出最小公倍数 [^4]。 以下是Java代码示例: ```java public class GCDandLCM { public static int calculateGCD(int num1, int num2) { while (num2 != 0) { int temp = num2; num2 = num1 % num2; num1 = temp; } return num1; } public static int calculateLCM(int num1, int num2) { int gcd = calculateGCD(num1, num2); int lcm = (num1 * num2) / gcd; return lcm; } public static void main(String[] args) { int num1 = 24; int num2 = 36; int gcd = calculateGCD(num1, num2); int lcm = calculateLCM(num1, num2); System.out.println("最大公约数: " + gcd); System.out.println("最小公倍数: " + lcm); } } ``` 也可以使用辗转相减法,即尼考曼彻斯法,其特色是做一系列减法,从而最大公约数。先比较两数字大小,得出大的数小的数,大数减去小数更新大数,再次比较大小并重复相减操作,直至结果相减结果为0时结束,此时相等的数字即是最大公约数,再根据两数之积与最大公约数的关系最小公倍数 [^5]。 以下是C语言代码示例: ```c #include<stdio.h> int main() { int a = 0; int b = 0; scanf("%d %d", &a, &b); int c = a, d = b; while (1) { if (a > b) { a = a - b; } else if (b > a) { b = b - a; } else { break; } } printf("%d %d", a, c * d / a); return 0; } ``` 此外,对于计算三个数的最大公约数最小公倍数问题,可多次嵌套解。先两个数的最大公约数最小公倍数,再其与第三个数的最大公约数最小公倍数 [^2]。 以下是Python代码示例: ```python def first_way(a, b): while b != 0: a, b = b, a % b return a def lcm(a, b): return a * b // first_way(a, b) def third_way(a, b): return first_way(a, b) def three_num(a, b, c): return first_way(first_way(a, b), c) a, b, c = map(int, input("请输入需要计算的整数用空格隔开:").split()) print("这三个数的最大公约数是:" + str(three_num(a, b, c))) print("这三个数的最小公倍数是:" + str(lcm(a, b) * c / third_way(third_way(a, b), c))) ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Unagi -_-

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值