辗转相除法
f(x, y) = f(y, x%y) 大整数取模运算开销昂贵
辗转相减法
1.任意给定两个正整数a和b;
2.若a和b不相等,则执行第3步;
3.选择a、b中较大者,将较大者与较小者的差赋值给较大者
4.判断重新赋值后的a和b是否相等,若不相等则继续执行第3步,否则执行第5步
5.返回a或b。
f(x, y) = f(y, x%y) 大整数取模运算开销昂贵
辗转相减法
1.任意给定两个正整数a和b;
2.若a和b不相等,则执行第3步;
3.选择a、b中较大者,将较大者与较小者的差赋值给较大者
4.判断重新赋值后的a和b是否相等,若不相等则继续执行第3步,否则执行第5步
5.返回a或b。
迭代次数增多,比如(10000000000000000,1)
1)
#include<iostream>
using namespace std;
int gcd(int x , int y)
{
if(!y)
return x;
else return gcd(y , x%y);
}
int main()
{
std::cout << "请输入两个正整数,计算它们的最大公约数" << endl ;
int a , b , ans;
std::cin >> a >> b;
if(a > b)
ans = gcd(a , b);
else ans = gcd(b , a);
cout << ans;
return 0;
}
class Integer
{
private:
int num;
public:
Integer(int num):num(num)
{
}
int gcd(Integer b)
{
int tempdata = 0;
if(num<b.num)
{
tempdata = num;
num = b.num;
b.num = tempdata;
}
while(tempdata = num % b.num)
{
num = b.num;
b.num = tempdata;
}
return b.num;
}
};
2)
#include <stdio.h>
int gcd(int a,int b);
int main(void)
{
int a,b;
scanf("%d%d",&a,&b);
printf("%d\n",gcd(a,b));
return 0;
}
int gcd(int a,int b)
{
if(a>b)
{
return gcd(a-b,b);
}
if(a<b)
{
return gcd(a,b-a);
}
return a;
}
3)
BigInt gcd(BigInt x,BigInt y)
{
if(x<y)
return gcd(y,x);
if(y==0)
return x;
else
{
if(isEvent(x))
{
if(isEvent(y))
return (gcd(x>>1,y>>1)<<1);
else
return gcd(x>>1,y);
}
else
{
if(isEvent(y))
return gcd(x,y>>1);
else
return gcd(y,x-y);
}
}
}
//isEvent(BigInt x)检查x是否为偶数,是返回true
(网络总结)