一.最大公约数
概念:最大公约数就是几个共有的因数中的最大值
例子:12与18的最大公因数为6
下面是几种求解最大公约数的方法
(1)穷举法(以上面的例子为例)
首先最大公因数的值一定12和18中的最小值小,所以我们首先使用一个变量用来保存最小值,接着在进行一个一个值的进行测试,最后如果这个值能够被12和18同时整除,那么就找到,代码如下:
#include<stdio.h>
int CommonDivisor2(int* m, int* n){
int a = *m;
int b = *n;
int tmp = a < b ? a : b;//找a和b中最小值
while (1)
{
if (a%tmp == 0 && b%tmp == 0)//可以同时被整除
{
break;
}
tmp--;
}
return tmp;
}
int main(){
int x = 12;
int y = 8;
int num2 = CommonDivisor2(&x, &y);
printf("%d\n", num2);
return 0;
}
(2)辗转相除法求最大公约数(相当于一种算法)
首先用大的数除以小的数(这里大小无所谓,因为大数除以小数经过赋值就调转过来了),得到的余数后,在接着用第一较小的数除以余数,一直循上面步骤直到余数为0,最后一个除数就是最大公约数。如下所示:
18%12余数为6 ,12%6余数为0,所以结果为6,程序如下:
int CommonDivisor(int* m, int* n){
int a = *m;
int b = *n;
while (a%b != 0)
{
int tmp = a%b;
a = b;//存的除数
b = tmp;//存的余数
}
return b;
}
(3)辗转相减法求最大公约数(相当于一种算法)
原理:大数减小数,所求结果接着和小数进行比较,直到两数相等
例如:18-12=6 ,12不等于6,12-6=6,6等于6,结果为6
代码如下:
int CommonDivisor(int* m, int* n){
int a = *m;
int b = *n;
while (a != b)
{
if (a > b)//大数减小数
{
a = a - b;
}
else
{
b = b - a;
}
}
return a;
}
二.最小公倍数
概念:几个公有的倍数中最小的一个
例子:6和8的最小公倍数为24
下面是几种求解最小公倍数的方法
(1)穷举法求最小公倍数
最小公倍数的值大于等于两个数中的最大值,所以首先找出两个数的最大值,接着由最大值向后面找,如果这个数能够整除这两个数则找到退出循环,返回该值,代码如下:
int CommonMultiple1(int* a, int* b)
{
if (*a < *b)//使a中存的最大值
{
int tmp = *a;
*a = *b;
*b = tmp;
}
for (int i = *a; i>1; i++)//从最大值开始找,相当于死循环
{
if (i % (*a) == 0 && i % (*b) == 0)
{
return i;//找到退出
}
}
}
(2)两数相乘除以最大公约数结果为最小公倍数(是一种算法)
首先求出两个数的最大公约数,然后使用公式进行求解
例如:8*6/2=24,代码如下:
int CommonMultiple(int* m,int* n){
int a = *m;
int b = *n;
//辗转相减法求最大公约数是一种算法
while (a != b)
{
if (a > b)//大数减小数
{
a = a - b;
}
else
{
b = b - a;
}
}
return (*m)*(*n) / a;//公式,最小公倍数结果
}