C求最大公约和最小公被数
方法1:蛮力法
// 对于输入的两个正整数m和n每次输入的大小顺序可能不同,
// 为了使程序具有一般性,
// 首先对整数所m和n进行大小排序,
// 规定变量m中存储大数、变量n中存储小数。
// 输入的两个数,大数m以下能被n和m整除的数
// 就是最大公约数
// 用for循环和i–试验出能够同时整除n和m的数;
// 并将其输出。需要注意的是,在找到第一个满足条件的i值后,循环没必要继续下去,
// 所以用break来结束循环。
#include <stdio.h>
int main() {
int n, m;
int temp;
int i = 0;
printf("请输入两个整数(用空格或回车隔开):");
scanf("%d %d", &n, &m);
if (n > m) { //交换最大植
temp = m;
m = n;
n = temp;
}
//查看当前值的顺序
printf("按照升序排的值:%d,%d\n\n", n, m);
//求最大公约数
for (i = m; i > 0; i--) {
if (n % i == 0 && m % i == 0) {
printf("最大公约数:%d\n", i);
break;
}
}
// 求最小公倍数
for (i = m; i > 0; i++) {
if (i % n == 0 && i % m == 0) {
printf("最小公倍数数:%d\n", i);
break;
}
}
}
方法2:辗转相除法
#include <stdio.h>
int main() {
int n, m;
int temp;
printf("请输入两个整数(用空格或回车隔开):");
scanf("%d %d", &n, &m);
if (n > m) { //交换最大植
temp = m;
m = n;
n = temp;
}
printf("按照升序排的值:%d,%d\n\n", n, m); //查看当前值的顺序
int gys(int n, int m) {
int y;
while (m % n != 0) {
y = m % n; //余数
m = n;
n = y; //局部变量
}
printf("最大公约数:%d\n", n);
return n; //函数返回值
}
int gbs;
gbs = n * m / gys(n, m) ;
//公倍数公式=最小公倍数等于两数之积除以其最大公约数
printf("最小公倍数:%d", gbs);
}
方法3:更相减损法
类似相减法;但是在偶数时;两数提前除2;调高效率
#include <stdio.h>
int main() {
int n, m;
int temp;
printf("请输入两个整数(用空格或回车隔开):");
scanf("%d %d", &n, &m);
if (n > m) { //交换最大植
temp = m;
m = n;
n = temp;
}
printf("按照升序排的值:%d,%d\n\n", n, m); //查看当前值的顺序
int gys(int n, int m) {
int sum = 1;
while (n % 2 == 0 && m % 2 == 0) {
n = n / 2;
m = m / 2;
sum=sum*2;
}
while (n != m) {
int t;
t = m - n;
if (t > n) {
m = t;
}
else
{
m = n;
n = t;
}
}
return sum*n;
}
/
int gbs;
gbs = n * m / gys(n, m) ;
//公倍数公式=最小公倍数等于两数之积除以其最大公约数
printf("最大公因数:%d\n", gys(n, m));
printf("最小公倍数:%d", gbs);
}