C++最大公約数と最小公倍数を求める
常用アルゴリズム:転がり相除算法は2つの自然数の最大公約数を求める方法であり、ユークリッドアルゴリズムとも呼ばれる.
転がり相除法の原理は以下の通りである.
例えば、求める(319377):
∵
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.
相を転がすことによって最大公約数が得られ,しばらくこの方法が考えられる.後で補充して、忘れないようにします.最小公倍数を求めるのはこれです
2つの数の積を最大公約数で割ると、つまり、肝心な問題はどのように最小公約数を求めるかです.C++コードは以下の通りです.
転がり相除法の原理は以下の通りである.
例えば、求める(319377):
∵
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.
相を転がすことによって最大公約数が得られ,しばらくこの方法が考えられる.後で補充して、忘れないようにします.最小公倍数を求めるのはこれです
2つの数の積を最大公約数で割ると、つまり、肝心な問題はどのように最小公約数を求めるかです.C++コードは以下の通りです.
<span style="font-family:Times New Roman;">#include<cstdio>
#include<cassert>
#include<cmath>
int main(){
long numA,numB,temp,mul;
scanf("%d %d",&numA,&numB);
if(numA<numB){
temp=numA;
numA=numB;
numB=temp;
}
mul=numA*numB;
while(numA%numB){
temp=numA%numB;
numA=numB;
numB=temp;
}
printf(" :%d
",mul/numB);
printf(" :%d
",numB);
return 0;
}</span>