• 萌新小白必做题(1):找两数间的最大公约数与最小公倍数


    1.最大公约数方法

    1.性质法(更相减损法)

    如果a>b,则a和b与a-b和b的最大公约数相同,即Gcd (a, b) = Gcd (a-b, b) 性质2 如果b>a,则a和b与a和b-a的最大公约数相同,即Gcd (a, b) = Gcd (a, b-a) 性质3 如果a=b,则a和b的最大公约数与a值和b值相同,即Gcd (a, b) = a = b

    步骤:

    1.判断a是否大于b,如果成立则将a-b的值赋给a,求a-b,反之如果b大于a,则将b-a的值赋给b,往复循环,直到a的值等于b时,两者中的任意一值就是它们的最大公约数。

    1. #include<stdio.h>
    2. int main()
    3. {
    4. int a = 0;
    5. int b = 0;
    6. scanf("%d %d", &a, &b);
    7. while ((a - b) != 0)
    8. {
    9. if (a > b)
    10. {
    11. a = a - b;
    12. }
    13. else
    14. {
    15. b = b - a;
    16. }
    17. }
    18. printf("%d %d\n", a, b);
    19. return 0;
    20. }

    方法2 暴力法

    根据最大公约数指的是两个整数公共的最大因数的概念,我们可以从两者中较小的值开始寻找,找到能够同时整除俩数的值就是最大共约数。

    步骤:

    1.先找出两者中最小值,从它开始递减循环,直到找到能够同时整除两个数的值(不能为0)就是它的最大公约数。

    1. #define MAX(x,y) ((x)>(y)?(x):(y))
    2. #define MIN(x,y) ((x)<(y)?(x):(y))
    3. #include<stdio.h>
    4. int main()
    5. {
    6. int a = 0;
    7. int b = 0;
    8. scanf("%d %d", &a, &b);
    9. int n = MAX(a, b);
    10. int m = MIN(a, b);
    11. for (int i = m; i >= 1; i--)
    12. {
    13. if (n % i == 0 && m % i == 0)
    14. {
    15. printf("%d\n", i);
    16. break;
    17. }
    18. }
    19. return 0;
    20. }

     方法3 辗转相除法

    辗转相除法之所以有效是因为其基于一个核心原理,即:

    两个数的最大公约数等于其中较小的数字和二者之间余数的最大公约数

    同样找出两数之间的最大值(n)与最小值(m),将n%m的值赋给一个中间变量temp,之后将m的值赋给n,temp的值赋给m,往复循环,直到temp为0,剩下的m就是最大公约数.

    1. #define MAX(x,y) ((x)>(y)?(x):(y))
    2. #define MIN(x,y) ((x)<(y)?(x):(y))
    3. #include<stdio.h>
    4. int main()
    5. {
    6. int a = 0;
    7. int b = 0;
    8. scanf("%d %d", &a, &b);
    9. int n = MAX(a, b);
    10. int m = MIN(a, b);
    11. int temp = 0;
    12. while (temp = n % m)
    13. {
    14. n = m;
    15. m = temp;
    16. }
    17. printf("%d\n", m);
    18. return 0;
    19. }

     2.最小公倍数方法

    1.枚举法

    与最大公约数的暴力法一样,两个或多个 整数 公有的 倍数 叫做它们的公倍数,其中除0以外最小的一个公倍数就叫做这几个整数的最小公倍数。

    步骤

    找出两数的最大值,从它开始递增,直到找到能够同时除余它们为0的数就是最小公倍数。

    1. #define MAX(x,y) ((x)>(y)?(x):(y))
    2. #define MIN(x,y) ((x)<(y)?(x):(y))
    3. #include<stdio.h>
    4. int main()
    5. {
    6. int a = 0;
    7. int b = 0;
    8. scanf("%d %d", &a, &b);
    9. int i = MAX(a, b);
    10. while (1)
    11. {
    12. if (i % a == 0 && i % b == 0)
    13. {
    14. break;
    15. }
    16. i++;
    17. }
    18. printf("%d\n", i);
    19. return 0;
    20. }

    2.性质法

    由最小公倍数的性质,n(较大值)乘以一个整数,除于m(较小值)==0时,n*i(整数)就是它们的最小公倍数。

    步骤

    找出两数间的最大与最小值,i从1开始,如果与n相乘%m==0则停止,n*i就是它们的最小公倍数。

    1. #define MAX(x,y) ((x)>(y)?(x):(y))
    2. #define MIN(x,y) ((x)<(y)?(x):(y))
    3. #include<stdio.h>
    4. int main()
    5. {
    6. int a = 0;
    7. int b = 0;
    8. scanf("%d %d", &a, &b);
    9. int n = MAX(a, b);
    10. int m = MIN(a, b);
    11. int i = 1;
    12. while (1)
    13. {
    14. if (n * i % m == 0)
    15. {
    16. break;
    17. }
    18. i++;
    19. }
    20. printf("%d\n", n*i);
    21. return 0;
    22. }

    方法3.找最大公约数法

    性质:两个数的乘积等于这两个数的最大公约数与最小公倍数的乘积。

    步骤

    利用上面的任意方法找到最大公约数,用两个数的乘积除以它就得到最小公倍数。

    1. #define MAX(x,y) ((x)>(y)?(x):(y))//宏定义
    2. #define MIN(x,y) ((x)<(y)?(x):(y))
    3. #include<stdio.h>
    4. int main()
    5. {
    6. int a = 0;
    7. int b = 0;
    8. scanf("%d %d", &a, &b);
    9. int n = MAX(a, b);
    10. int m = MIN(a, b);
    11. int z = 0;
    12. while (z = n % m) //辗转相除法
    13. {
    14. n = m;
    15. m = z;
    16. }
    17. printf("%d", (a * b) / m);
    18. return 0;
    19. }

     

  • 相关阅读:
    A. Knapsack
    Oracle Primavera Unifier 23.4 新特征
    若依系统富文本框上传图片报错!
    2023.10.17
    第十四届蓝桥杯第二期模拟赛题解
    【Redis 神秘大陆】005 常见性能优化方式
    Redis命令手册
    pyTorch——基础学习笔记
    C# 快速排序
    Linux——gdb调试时多进程切换方法(attach/follow-fork-mode)
  • 原文地址:https://blog.csdn.net/wcl312/article/details/133875455