Code[VS] 1212 最大公约数

来源:互联网 发布:淘宝做单一个月挣多少 编辑:程序博客网 时间:2024/05/17 23:52

难度:*


题意:给定两个数a,b,求其最大公约数
输入:
只有一行,为a,b (-maxlongint-1<=a,b<=maxlongint)
输出:
只有一行,为a,b的最大公约数


板块:数学——数论

数据结构:——
算法:欧几里德算法


分析:

最大公约数的模板题,下面用三种方式实现


代码:
1、递归实现:
#include <cstdio>
#include <cstdlib>
int a,b;
int gcd(int i,int j)
{
return j?gcd(j,i%j):i;
}
int main(void)
{
scanf("%d%d",&a,&b);
printf("%d\n",gcd(a,b));
return 0;
}


2、非递归实现
#include <cstdio>
#include <cstdlib>
int a,b;
int gcd(int i,int j)
{
int r;
while (j)
{
r=i%j;
i=j;
j=r;
}
return i;
}
int main(void)
{
scanf("%d%d",&a,&b);
printf("%d\n",gcd(a,b));
return 0;
}


3、二进制优化算法
#include <cstdio>
#include <cstdlib>
int a,b;
int gcd(int i,int j)
{
if (j==0) return i;
if (!(i&1)&&!(j&1)) return (gcd(i>>1,j>>1))<<1;
if (!(i&1)&&(j&1)) return gcd(i>>1,j);
if ((i&1)&&!(j&1)) return gcd(i,j>>1);
return gcd(j,i%j);
}
int main(void)
{
scanf("%d%d",&a,&b);
printf("%d\n",gcd(a,b));
return 0;
}
0 0