一、最大公因数,也称最大公约数、最大公因子,指两个或多个整数共有约数中最大的一个。a,b的最大公约数记为(a,b),同样的,a,b,c的最大公约数记为(a,b,c),多个整数的最大公约数也有同样的记号。求最大公约数有多种方法,常见的有质因数分解法、短除法、辗转相除法、更相减损法。与最大公约数相对应的概念是最小公倍数,a,b的最小公倍数记为[a,b]。
二、求法:
1.质因数分解法
质因数分解法:把每个数分别分解质因数,再把各数中的全部公有质因数提取出来连乘,所得的积就是这几个数的
最大公约数。
例如:求24和60的最大公约数,先分解质因数,得24=2×2×2×3,60=2×2×3×5,24与60的全部公有的质因数是2、2、3,它们的积是2×2×3=12,所以,(24、60)=12
。
把几个数先分别分解质因数,再把各数中的全部公有的质因数和独有的质因数提取出来连乘,所得的积就是这几个数的最小公倍数。例如:求6和15的最小公倍数。先分解质因数,得6=2×3,15=3×5,6和15的全部公有的质因数是3,6独有质因数是2,15独有的质因数是5,2×3×5=30,30里面包含6的全部质因数2和3,还包含了15的全部质因数3和5,且30是6和15的公倍数中最小的一个,所以[6,15]=30。若求出两个数的最大公约数,用两个数的乘积除以他们的最大公约数就能得到最小公倍数。6=2*3,15=3*5.所有质因数是2,3和3,5,其中最大公约数是3,最小公倍数是2*3*5=30;(2*3)*(3*5)/3=(6*15)/3=30
分解质因数的代码
#include<iostream>
using namespace std;
int main()
{
int n,n2,i;
cin>>n;
n2=n;
cout<<n<<"=";
for( i=2; i<n; i++)
{
if(n%i==0)
{
n = n/i;
n2=n;
cout<<i<<"*";
i=1;
}
}
cout<<n2<<endl;
return 0;
}
2.
辗转相除法
:
辗转相除法是求两个自然数的最大公约数的一种方法,也叫
欧几里德算法
。
这就是辗转相除法的原理。
例如,求(319,377):
∵ 319÷377=0(余319)
∴(319,377)=(377,319);
∵ 377÷319=1(余58)
∴(377,319)=(319,58);
∵ 319÷58=5(余29),
∴ (319,58)=(58,29);
∵ 58÷29=2(余0),
∴ (58,29)= 29;
∴ (319,377)=29.
为什么这样求出是就是最大公约数呢?下面对a,b为正整数(a>b)的情形给出说明。
根据定理10.2,商q和余r数满足a=bq+r,且0≤r ≤b-1. 若r=0,显然(a,b)=b;若r≠0,由于a=bq+r,每个能整除b,r的整数都能整除a,当然能同时整除a,b,所以(b,r)|(a,b);另一方面,r=a-bq,每个能整除a,b的整数都能整除r, 当然能同时整除b,r, 所以(a,b)|(b,r).因此(a,b)=(b,r).
根据定理10.2,商q和余r数满足a=bq+r,且0≤r ≤b-1. 若r=0,显然(a,b)=b;若r≠0,由于a=bq+r,每个能整除b,r的整数都能整除a,当然能同时整除a,b,所以(b,r)|(a,b);另一方面,r=a-bq,每个能整除a,b的整数都能整除r, 当然能同时整除b,r, 所以(a,b)|(b,r).因此(a,b)=(b,r).
辗转相除法的代码:
#include<iostream>
using namespace std;
int main()
{
int a,b;
cin>>a;
cin>>b;
cout<<a<<"和"<<b<<"的"<<endl;
int temp = a*b;
int r;
if(a<b)
{
a = a+b;
b = a-b;
a = a-b;
}
while(b!=0)
{
r = a%b;
a=b;
b=r;
}
cout<<"最大公约数:"<<a<<endl;
cout<<"最小公倍数:"<<temp/a<<endl;
return 0;
}