最大公约数(GCD)——最小公倍数(LCM)

GCD:Greatest Common Divisor.

欧几里德算法(Euclid)阐述了一种求gcd的算法。


//最大公约数 
int gcd(int a,int b)
{
	if(b==0) return a;
	return gcd(b,a%b);
} 
//因为 最小公倍数*最大公约数=a*b 
//所以 最小公倍数 
lcm=a*b/gcd(a,b); 

拓展欧几里得算法

双六问题

题目:一个双六上面有向前向后无限延续的格子,每个格子都写

有整数。其中0号格子是起点,1 号格子是终点。而骰子上只有a,b,-a,-b四个整数,

所以根据a和b的值的不同,有可能无法到达终点。现在的问题是掷出a,b,-a,-b各

多少次可以达到终点呢?

输入:一行,包含两个数 a 和 b,两数之间用一个空格分隔,含义如题目所述。

输出:一个数,表示掷出四个整数次数的和,如果解不唯一,就输出和最小的值,

如果无解则输出 0 。

 输入示例:4 11

 输出示例:4

数据范围:1<=a,b<=10^9

题解:实际上这个问题可以转化为求 ax+by=1的解

#include <iostream>  
#include <cstdio>  
#include <string>  
#include <algorithm>  
using namespace std;  
int gcd(int a,int b)  
{  
    return b==0?a:gcd(b,a%b);  
}  
void ex_gcd(int a,int b,int &x,int &y)  
{  
    if(b==0)  
    {  
        x=1;  
        y=0;  
        return;  
    }  
    else  
  
    {  
        ex_gcd(b,a%b,x,y);  
        int t=x;  
        x=y;  
        y=t-(a/b)*y;  
    }  
}  
int main ()  
{  
    int a,b;  
    int x,y;  
    while(scanf("%d%d",&a,&b)!=EOF)  
    {  
        ex_gcd(a,b,x,y);  
        if(gcd(a,b)!=1) printf("impossible\n");  
        else printf("%d %d\n",x,y);  
    }  
    return  0;  
} 

猜你喜欢

转载自blog.csdn.net/qq_40727946/article/details/80044580