1、辗转相除法(欧几里德算法)
求两个数最大公约数最常用的方法之一,其原理是利用两个数的除法余数的递归来求解。
#include <stdio.h> // 函数声明:计算最大公约数 int gcd(int a, int b); int main() { int num1, num2; // 输入两个整数 printf("请输入两个整数:\n"); scanf("%d %d", &num1, &num2); // 调用函数计算最大公约数 int result = gcd(num1, num2); // 输出最大公约数 printf("最大公约数是:%d\n", result); return 0; } // 函数定义:计算最大公约数(辗转相除法) int gcd(int a, int b) { int temp; while (b != 0) { temp = a % b; a = b; b = temp; } return a; }
2、递归实现辗转相除法
使用递归方式实现辗转相除法求最大公约数。
#include <stdio.h> // 函数声明:计算最大公约数 int gcd(int a, int b); int main() { int num1, num2; // 输入两个整数 printf("请输入两个整数:\n"); scanf("%d %d", &num1, &num2); // 调用函数计算最大公约数 int result = gcd_recursive(num1, num2); // 输出最大公约数 printf("最大公约数是:%d\n", result); return 0; } int gcd_recursive(int a, int b) { if (b == 0) { return a; } else { return gcd_recursive(b, a % b); } }
3、更相减损术
古老的方法,通过连续减小较大数和较小数的差来求最大公约数。
#include <stdio.h> // 函数声明:计算最大公约数 int gcd(int a, int b); int main() { int num1, num2; // 输入两个整数 printf("请输入两个整数:\n"); scanf("%d %d", &num1, &num2); // 调用函数计算最大公约数 int result = gcd_subtraction(num1, num2); // 输出最大公约数 printf("最大公约数是:%d\n", result); return 0; } int gcd_subtraction(int a, int b) { while (a != b) { if (a > b) { a = a - b; } else { b = b - a; } } return a; }
4、穷举法
从较小的数开始递减,找到两个数都能整除的最大数。
#include <stdio.h> // 函数声明:计算最大公约数 int gcd(int a, int b); int main() { int num1, num2; // 输入两个整数 printf("请输入两个整数:\n"); scanf("%d %d", &num1, &num2); // 调用函数计算最大公约数 int result = gcd_brute_force(num1, num2); // 输出最大公约数 printf("最大公约数是:%d\n", result); return 0; } int gcd_brute_force(int a, int b) { int gcd = 1; for (int i = 1; i <= a && i <= b; ++i) { if (a % i == 0 && b % i == 0) { gcd = i; } } return gcd; }
5、位操作法
利用位运算的性质来求解,效率较高。
#include <stdio.h> // 函数声明:计算最大公约数 int gcd(int a, int b); int main() { int num1, num2; // 输入两个整数 printf("请输入两个整数:\n"); scanf("%d %d", &num1, &num2); // 调用函数计算最大公约数 int result = gcd_bitwise(num1, num2); // 输出最大公约数 printf("最大公约数是:%d\n", result); return 0; } int gcd_bitwise(int a, int b) { if (a == 0) return b; if (b == 0) return a; int shift; for (shift = 0; ((a | b) & 1) == 0; ++shift) { a >>= 1; b >>= 1; } while ((a & 1) == 0) a >>= 1; do { while ((b & 1) == 0) b >>= 1; if (a > b) { unsigned int t = b; b = a; a = t; } b = b - a; } while (b != 0); return a << shift; }