前言

  • 这个求解方式多样化,灵活变动,但是,网上没有很好的资源和很全的代码,特此练习,敲打后,总结成本片文章.

单一求解

一.最大公约数

1.穷举法(最简单求解方式)

  • 利用除法方式用当前的数字不断去除以比较小的那个数的范围,最后得到两个数都可以整除的那个数.(这种方法也是最容易想到的)

核心代码

  1. // 用比较小的一个数作为循环范围,然后不断减少,以便求出最后的公约数
  2. void getResult(int a, int b, int min)
  3. {
  4. for (int i = min; i > 1; i--)
  5. {
  6. if (a%i == 0 && b%i == 0)
  7. {
  8. printf("%d %d的最大公约数是:%d\n", a, b, i);
  9. }
  10. }
  11. }

完整代码

  1. #define _CRT_SECURE_NO_WARNINGS 1
  2. // 此文件包含 "main" 函数。程序执行将在此处开始并结束。
  3. //
  4. #include <stdio.h>
  5. #include <stdlib.h>
  6. void maxCommonNumber();
  7. void getResult(int a, int b, int min);
  8. int main()
  9. {
  10. maxCommonNumber();
  11. system("pause");
  12. return 0;
  13. }
  14. void maxCommonNumber() {
  15. int a = 0;
  16. int b = 0;
  17. int result = 0;
  18. printf("请输入两个数:\n");
  19. printf("请输入第一个数a:");
  20. scanf("%d", &a);
  21. printf("请输入第二个数b:");
  22. scanf("%d", &b);
  23. if (a > b)
  24. {
  25. getResult(a, b, b);
  26. }
  27. else {
  28. getResult(a, b,a);
  29. }
  30. }
  31. // 用比较小的一个数作为循环范围,然后不断减少,以便求出最后的公约数
  32. void getResult(int a, int b, int min)
  33. {
  34. for (int i = min; i > 1; i--)
  35. {
  36. if (a%i == 0 && b%i == 0)
  37. {
  38. printf("%d %d的最大公约数是:%d\n", a, b, i);
  39. }
  40. }
  41. }
  • 优化算法
  1. #define _CRT_SECURE_NO_WARNINGS 1
  2. // 此文件包含 "main" 函数。程序执行将在此处开始并结束。
  3. //
  4. #include <stdio.h>
  5. #include <stdlib.h>
  6. void maxCommonNumber();
  7. void getResult(int a, int b, int min);
  8. int main()
  9. {
  10. maxCommonNumber();
  11. system("pause");
  12. return 0;
  13. }
  14. void maxCommonNumber() {
  15. int a = 0;
  16. int b = 0;
  17. int result = 0;
  18. printf("请输入两个数:\n");
  19. printf("请输入第一个数a:");
  20. scanf("%d", &a);
  21. printf("请输入第二个数b:");
  22. scanf("%d", &b);
  23. if (a > b)
  24. {
  25. getResult(a, b, b);
  26. }
  27. else {
  28. getResult(a, b,a);
  29. }
  30. }
  31. // 优化算法
  32. void getResult(int a, int b, int min) {
  33. int temp = 0;
  34. // 接收最小的值,对这个值进行操作,因为没用指针,所以这里用变量接收值修改
  35. temp = min;
  36. while (temp > 0)
  37. {
  38. if (a%temp == 0 && b%temp == 0)
  39. {
  40. break;
  41. }
  42. temp--;
  43. }
  44. printf("[%d %d]的最大公约数是:%d\n", a, b, temp);
  45. }

2.递减法操作

  • 通过不断的相减获取最大公约数.

核心代码


  1. // 优化算法
  2. void getResult(int a, int b, int min) {
  3. int temp_A = 0;
  4. int temp_B = 0;
  5. // 接收最小的值,对这个值进行操作,因为没用指针,所以这里用变量接收值修改
  6. temp_A = a;
  7. temp_B = b;
  8. while (temp_A != temp_B)
  9. {
  10. if (temp_A > temp_B)
  11. {
  12. temp_A = temp_A - temp_B;
  13. }
  14. else
  15. {
  16. temp_B = temp_B - temp_A;
  17. }
  18. }
  19. printf("[%d %d]的最大公约数是:%d\n", a, b, temp_A);
  20. }

完整代码

  1. #define _CRT_SECURE_NO_WARNINGS 1
  2. // 此文件包含 "main" 函数。程序执行将在此处开始并结束。
  3. //
  4. #include <stdio.h>
  5. #include <stdlib.h>
  6. void maxCommonNumber();
  7. void getResult(int a, int b, int min);
  8. int main()
  9. {
  10. maxCommonNumber();
  11. system("pause");
  12. return 0;
  13. }
  14. void maxCommonNumber() {
  15. int a = 0;
  16. int b = 0;
  17. int result = 0;
  18. printf("请输入两个数:\n");
  19. printf("请输入第一个数a:");
  20. scanf("%d", &a);
  21. printf("请输入第二个数b:");
  22. scanf("%d", &b);
  23. if (a > b)
  24. {
  25. getResult(a, b, b);
  26. }
  27. else {
  28. getResult(a, b,a);
  29. }
  30. }
  31. // 优化算法
  32. void getResult(int a, int b, int min) {
  33. int temp_A = 0;
  34. int temp_B = 0;
  35. // 接收最小的值,对这个值进行操作,因为没用指针,所以这里用变量接收值修改
  36. temp_A = a;
  37. temp_B = b;
  38. while (temp_A != temp_B)
  39. {
  40. if (temp_A > temp_B)
  41. {
  42. temp_A = temp_A - temp_B;
  43. }
  44. else
  45. {
  46. temp_B = temp_B - temp_A;
  47. }
  48. }
  49. printf("[%d %d]的最大公约数是:%d\n", a, b, temp_A);
  50. }

3.辗转相除法

  • 不断的让两个数做除法运算。其原理基于两个整数的最大公约数等于其中较小的数和两数的相除余数的最大公约数

核心代码

  1. // 优化算法
  2. void getResult(int a, int b, int min) {
  3. int temp = 0;
  4. int temp_A = 0;
  5. int temp_B = 0;
  6. // 接收最小的值,对这个值进行操作,因为没用指针,所以这里用变量接收值修改
  7. temp_A = a;
  8. temp_B = b;
  9. while (temp_B != 0) // 余数不为0,继续相除,直到余数为0
  10. {
  11. temp = temp_A % temp_B;
  12. temp_A = temp_B;
  13. temp_B = temp;
  14. }
  15. printf("[%d %d]的最大公约数是:%d\n", a, b, temp_A);
  16. }

完整代码

  1. #define _CRT_SECURE_NO_WARNINGS 1
  2. // 此文件包含 "main" 函数。程序执行将在此处开始并结束。
  3. //
  4. #include <stdio.h>
  5. #include <stdlib.h>
  6. void maxCommonNumber();
  7. void getResult(int a, int b, int min);
  8. int main()
  9. {
  10. maxCommonNumber();
  11. system("pause");
  12. return 0;
  13. }
  14. void maxCommonNumber() {
  15. int a = 0;
  16. int b = 0;
  17. int result = 0;
  18. printf("请输入两个数:\n");
  19. printf("请输入第一个数a:");
  20. scanf("%d", &a);
  21. printf("请输入第二个数b:");
  22. scanf("%d", &b);
  23. if (a > b)
  24. {
  25. getResult(a, b, b);
  26. }
  27. else {
  28. getResult(a, b,a);
  29. }
  30. }
  31. // 优化算法
  32. void getResult(int a, int b, int min) {
  33. int temp = 0;
  34. int temp_A = 0;
  35. int temp_B = 0;
  36. // 接收最小的值,对这个值进行操作,因为没用指针,所以这里用变量接收值修改
  37. temp_A = a;
  38. temp_B = b;
  39. while (temp_B != 0) // 余数不为0,继续相除,直到余数为0
  40. {
  41. temp = temp_A % temp_B;
  42. temp_A = temp_B;
  43. temp_B = temp;
  44. }
  45. printf("[%d %d]的最大公约数是:%d\n", a, b, temp_A);
  46. }

4.递归法

核心代码

  1. int gcd1(int x, int y) {
  2. int temp = x % y;
  3. if (temp == 0)
  4. {
  5. return y;
  6. }
  7. else
  8. {
  9. return(y, temp);
  10. }
  11. }

完整代码


  1. #define _CRT_SECURE_NO_WARNINGS 1
  2. // 此文件包含 "main" 函数。程序执行将在此处开始并结束。
  3. //
  4. #include <stdio.h>
  5. #include <stdlib.h>
  6. void maxCommonNumber();
  7. void getResult(int a, int b);
  8. int gcd1(int x, int y);
  9. int main()
  10. {
  11. maxCommonNumber();
  12. system("pause");
  13. return 0;
  14. }
  15. void maxCommonNumber() {
  16. int a = 0;
  17. int b = 0;
  18. int result = 0;
  19. printf("请输入两个数:\n");
  20. printf("请输入第一个数a:");
  21. scanf("%d", &a);
  22. printf("请输入第二个数b:");
  23. scanf("%d", &b);
  24. if (a > b)
  25. {
  26. getResult(a, b, b);
  27. }
  28. else {
  29. getResult(a, b,a);
  30. }
  31. }
  32. // 优化算法
  33. void getResult(int a, int b) {
  34. int result = gcd1(a, b);
  35. printf("[%d %d]的最大公约数是:%d\n", a, b, result);
  36. }
  37. int gcd1(int x, int y) {
  38. int temp = x % y;
  39. if (temp == 0)
  40. {
  41. return y;
  42. }
  43. else
  44. {
  45. return(y, temp);
  46. }
  47. }

5.位运算法

核心代码


  1. int gcd(int x, int y) {
  2. // 交换x和y的值,然后进行y/x运算
  3. while (x ^= y ^= x ^= y %= x);
  4. return y;
  5. }
  • 其中
  1. x ^= y ^= x ^= y %= x
  • 翻译为
  1. 假设 x=2;y=1;
  2. 拆分为:
  3. x ^= y ^= x ^= y %= x
  4. // 交换x和y的数字(这样就把x=2;y=1;变为x=2;y=1;)
  5. x^=y; // x = x ^ y;x的y次方 => x = 2 ^ 1; => x=2;
  6. y^=x; // x = x ^ y;x的y次方 => y = 1 ^ 2; => y=1;
  7. x^=y; // x = x ^ y;x的y次方 => x = 2 ^ 1; => x=2;
  8. // y对x取模
  9. y%=x; // y = y % x; y除以x的余数 => y = 1%2 => y=2;

完整代码


  1. #define _CRT_SECURE_NO_WARNINGS 1
  2. // 此文件包含 "main" 函数。程序执行将在此处开始并结束。
  3. //
  4. #include <stdio.h>
  5. #include <stdlib.h>
  6. void maxCommonNumber();
  7. void getResult(int a, int b);
  8. int gcd1(int x, int y);
  9. int main()
  10. {
  11. maxCommonNumber();
  12. system("pause");
  13. return 0;
  14. }
  15. void maxCommonNumber() {
  16. int a = 0;
  17. int b = 0;
  18. int result = 0;
  19. printf("请输入两个数:\n");
  20. printf("请输入第一个数a:");
  21. scanf("%d", &a);
  22. printf("请输入第二个数b:");
  23. scanf("%d", &b);
  24. if (a > b)
  25. {
  26. getResult(a, b, b);
  27. }
  28. else {
  29. getResult(a, b,a);
  30. }
  31. }
  32. // 优化算法
  33. void getResult(int a, int b) {
  34. int result = gcd1(a, b);
  35. printf("[%d %d]的最大公约数是:%d\n", a, b, result);
  36. }
  37. int gcd1(int x, int y) {
  38. // 交换x和y的值,然后进行y/x运算
  39. while (x ^= y ^= x ^= y %= x);
  40. return y;
  41. }

二.最小公倍数

1.穷举法

核心代码


  1. void getResult(int a, int b,int max) {
  2. int temp = 0;
  3. for (int i = max; i <= (a*b); i++)
  4. {
  5. if (i%a == 0 && i%b == 0)
  6. {
  7. temp = i;
  8. break;
  9. }
  10. }
  11. printf("[%d %d]的最小公倍数是:%d\n", a, b, temp);

完整代码


  1. #define _CRT_SECURE_NO_WARNINGS 1
  2. // 此文件包含 "main" 函数。程序执行将在此处开始并结束。
  3. //
  4. #include <stdio.h>
  5. #include <stdlib.h>
  6. void maxCommonNumber();
  7. void getResult(int a, int b, int max);
  8. int main()
  9. {
  10. maxCommonNumber();
  11. system("pause");
  12. return 0;
  13. }
  14. void maxCommonNumber() {
  15. int a = 0;
  16. int b = 0;
  17. int result = 0;
  18. printf("请输入两个数:\n");
  19. printf("请输入第一个数a:");
  20. scanf("%d", &a);
  21. printf("请输入第二个数b:");
  22. scanf("%d", &b);
  23. if (a > b)
  24. {
  25. getResult(a, b, a);
  26. }
  27. else {
  28. getResult(a, b,b);
  29. }
  30. }
  31. // 优化算法
  32. void getResult(int a, int b,int max) {
  33. int temp = 0;
  34. for (int i = max; i <= (a*b); i++)
  35. {
  36. if (i%a == 0 && i%b == 0)
  37. {
  38. temp = i;
  39. break;
  40. }
  41. }
  42. printf("[%d %d]的最小公倍数是:%d\n", a, b, temp);
  43. }

2.辗转相除法

核心代码


  1. // 优化算法
  2. void getResult(int a, int b) {
  3. // 用于自增的变量
  4. int temp = 0;
  5. // 接收最小公倍数最后的结果
  6. int gongbei = 0;
  7. // ===== 没有使用指针,所以,采用用变量接收修改参数值的方法 ******
  8. temp = a;
  9. // 获取两个数中较大的一个
  10. gongbei = a;
  11. while (1)
  12. {
  13. // 两个数中较大的数除以较小的数,能除开就说明最大的数就是两个数的最小公倍数
  14. if (gongbei%b == 0) {
  15. break;
  16. }
  17. // 较大的数除不开较小的数,最大的数就再加一个自己再循环除第二个数
  18. // 累加获得最小公倍数
  19. gongbei += temp;
  20. }
  21. printf("[%d %d]的最小公倍数是:%d\n", a, b, gongbei);
  22. }

完整代码


  1. #define _CRT_SECURE_NO_WARNINGS 1
  2. // 此文件包含 "main" 函数。程序执行将在此处开始并结束。
  3. //
  4. #include <stdio.h>
  5. #include <stdlib.h>
  6. void maxCommonNumber();
  7. void getResult(int a, int b);
  8. int main()
  9. {
  10. maxCommonNumber();
  11. system("pause");
  12. return 0;
  13. }
  14. void maxCommonNumber() {
  15. int a = 0;
  16. int b = 0;
  17. int result = 0;
  18. printf("请输入两个数:\n");
  19. printf("请输入第一个数a:");
  20. scanf("%d", &a);
  21. printf("请输入第二个数b:");
  22. scanf("%d", &b);
  23. if (a > b)
  24. {
  25. getResult(a, b);
  26. }
  27. else {
  28. getResult(a, b);
  29. }
  30. }
  31. // 优化算法
  32. void getResult(int a, int b) {
  33. // 用于自增的变量
  34. int temp = 0;
  35. // 接收最小公倍数最后的结果
  36. int gongbei = 0;
  37. // ===== 没有使用指针,所以,采用用变量接收修改参数值的方法 ******
  38. temp = a;
  39. // 获取两个数中较大的一个
  40. gongbei = a;
  41. while (1)
  42. {
  43. // 两个数中较大的数除以较小的数,能除开就说明最大的数就是两个数的最小公倍数
  44. if (gongbei%b == 0) {
  45. break;
  46. }
  47. // 较大的数除不开较小的数,最大的数就再加一个自己再循环除第二个数
  48. // 累加获得最小公倍数
  49. gongbei += temp;
  50. }
  51. printf("[%d %d]的最小公倍数是:%d\n", a, b, gongbei);
  52. }

3.通过公约数获取

核心代码


  1. int function_my(int x, int y) {
  2. return x * y / gcd1(x, y);
  3. }

完整代码


  1. #define _CRT_SECURE_NO_WARNINGS 1
  2. // 此文件包含 "main" 函数。程序执行将在此处开始并结束。
  3. //
  4. #include <stdio.h>
  5. #include <stdlib.h>
  6. void maxCommonNumber();
  7. void getResult(int a, int b);
  8. int gcd1(int x, int y);
  9. int function_my(int x, int y);
  10. int main()
  11. {
  12. maxCommonNumber();
  13. system("pause");
  14. return 0;
  15. }
  16. void maxCommonNumber() {
  17. int a = 0;
  18. int b = 0;
  19. int result = 0;
  20. printf("请输入两个数:\n");
  21. printf("请输入第一个数a:");
  22. scanf("%d", &a);
  23. printf("请输入第二个数b:");
  24. scanf("%d", &b);
  25. if (a > b)
  26. {
  27. getResult(a, b);
  28. }
  29. else {
  30. getResult(a, b);
  31. }
  32. }
  33. // 优化算法
  34. void getResult(int a, int b) {
  35. int result = function_my(a, b);
  36. printf("[%d %d]的最小公倍数是:%d\n", a, b, result);
  37. }
  38. int gcd1(int x, int y) {
  39. // 交换x和y的值,然后进行y/x运算
  40. while (x ^= y ^= x ^= y %= x);
  41. return y;
  42. }
  43. int function_my(int x, int y) {
  44. return x * y / gcd1(x, y);
  45. }

合并求解

最大公约和最小公倍一起求


  1. #define _CRT_SECURE_NO_WARNINGS 1
  2. // 此文件包含 "main" 函数。程序执行将在此处开始并结束。
  3. //
  4. #include <stdio.h>
  5. #include <stdlib.h>
  6. void maxCommonNumber();
  7. void getResult(int a, int b);
  8. int gcd1(int x, int y);
  9. int function_my(int x, int y);
  10. int main()
  11. {
  12. maxCommonNumber();
  13. system("pause");
  14. return 0;
  15. }
  16. void maxCommonNumber() {
  17. int a = 0;
  18. int b = 0;
  19. int result = 0;
  20. printf("请输入两个数:\n");
  21. printf("请输入第一个数a:");
  22. scanf("%d", &a);
  23. printf("请输入第二个数b:");
  24. scanf("%d", &b);
  25. getResult(a, b);
  26. }
  27. // 结果
  28. void getResult(int a, int b) {
  29. int yue = gcd1(a, b);
  30. printf("[%d %d]最大公约数:%d\n", a, b, yue);
  31. int bei = function_my(a, b);
  32. printf("[%d %d]最小公倍数:%d\n", a, b, bei);
  33. }
  34. int gcd1(int x, int y) {
  35. // 交换x和y的值,然后进行y/x运算
  36. while (x ^= y ^= x ^= y %= x);
  37. return y;
  38. }
  39. int function_my(int x, int y) {
  40. return x * y / gcd1(x, y);
  41. }

C语言求最大公约数最小公倍数(多种方法)的更多相关文章

  1. c语言求最大公约数和最小公倍数

    求最大公约数和最小公倍数 假设有两个数a和b,求a,b的最大公约数和最小公倍数实际上是一个问题,得出这两个数的最大公约数就可以算出它们的最小公倍数. 最小公倍数的公式是 a*b/m m为最大公约数 因 ...

  2. c语言求最大公约数和最小公倍数(转)

    最大公约数与最小公倍数的求解是很多初学C的人所面临的一道问题.当然这道问题并不难解答,也有很多人已经写过相关的博客,我在此书写此篇博客,一是为了让自己能够夯实基础,另外就是希望能够帮到和我一样的初学者 ...

  3. C语言 · 求最大公约数

    算法提高 求最大公约数   时间限制:1.0s   内存限制:512.0MB      编写一函数gcd,求两个正整数的最大公约数. 样例输入: 5 15样例输出:5 样例输入: 7 2样例输出:1 ...

  4. c语言求最大公约数

    求差判定法. 如果两个数相差不大,可以用大数减去小数,所得的差与小数的最大公约数就是原来两个数的最大公约数.例如:求78和60的最大公约数.78-60=18,18和60的最大公约数是6,所以78和60 ...

  5. Java求最大公约数和最小公倍数

    最大公约数(Greatest Common Divisor(GCD)) 基本概念 最大公因数,也称最大公约数.最大公因子,指两个或多个整数共有约数中最大的一个.a,b的最大公约数记为(a,b),同样的 ...

  6. C语言中如何求最大公约数及如何求最小公倍数。

    最大公约数:                                                                                               ...

  7. 常见算法:C语言求最小公倍数和最大公约数三种算法

    最小公倍数:数论中的一种概念,两个整数公有的倍数成为他们的公倍数,当中一个最小的公倍数是他们的最小公倍数,相同地,若干个整数公有的倍数中最小的正整数称为它们的最小公倍数,维基百科:定义点击打开链接 求 ...

  8. C语言求最小公倍数和最大公约数三种算法(经典)

    把以前写的一些经验总结汇个总,方便给未来的学弟学妹们做个参考! --------------------------永远爱你们的:Sakura 最小公倍数:数论中的一种概念,两个整数公有的倍数成为他们 ...

  9. C语言求最小公倍数和最大公约数三种算法

    最小公倍数:数论中的一种概念,两个整数公有的倍数成为他们的公倍数,其中一个最小的公倍数是他们的最小公倍数,同样地,若干个整数公有的倍数中最小的正整数称为它们的最小公倍数,维基百科:定义点击打开链接 求 ...

随机推荐

  1. 记录VMware安装VMware Tools过程及遇到的一些问题

    镜像下载.域名解析.时间同步请点击 阿里云开源镜像站 本文以CentOS安装为例 为什么要安装VMware Tools ? 便于在Windows 下更好管理虚拟机 便于设置Windows和CentOS ...

  2. nginx配置只允许某个IP或某些IP进行访问

    server{ listen 80; listen 443 ssl; server_name ehall.jerry.plus; ssl_certificate "****.crt" ...

  3. Mysql学习笔记-InnoDB深度解析

    前言 我们在上一篇博客聊了Mysql的整体架构分布,连接层.核心层.存储引擎层和文件系统层,其中存储引擎层作为Mysql Server中最重要的一部分,为我们sql交互提供了数据基础支持.存储引擎和文 ...

  4. cute

    环境准备 将靶机导入后将网络设置为NAT kali:192.168.0.102 cute:192.168.0.107 端口扫描 使用nmap对靶机进行端口扫描 nmap –A –p- 192.168. ...

  5. url斜杠问题——重定向

    path('hello',hello), path('hello/',hello), 有什么区别? 没有斜杠:只能访问hello 有斜杠:可以访问hello和hello/ 分析有斜杠的: hello- ...

  6. Prometheus+alertmanager告警配置-2

    prometheus 告警 prometheus 通过alertmanager进行告警 实现监控告警的步骤: 在prometheus中定义告警规则rule_files alertmanager配置告警 ...

  7. Oracle 数据库应用开发 30 忌

    原创 LaoYuanPython CSDN 今天 作者 | LaoYuanPython       责编 | 欧阳姝黎出品 | CSDN原力计划 引言 笔者及所在团队从 2000 年开始的 CRM 等 ...

  8. Spring基于xml注入bean的几种方式?

    (1)Set方法注入: (2)构造器注入:①通过index设置参数的位置:②通过type设置参数类型: (3)静态工厂注入: (4)实例工厂:

  9. Eclipse建立Web项目,手动生成web.xml文件

    相关文章:https://blog.csdn.net/ys_code/article/details/79156188(Web项目建立,手动生成web.xml文件

  10. 判断1~n有多少个1

    判断1~n有多少个1 例如:1~12中 1 2 3 4 5 6 7 8 9 10 11 12 有1,10,11,12中含有1,则共有5个1: 算法如下: #include<stdio.h> ...