1.求最大公约数
例:线段上格点的个数
题意:给定平面上的两个格点P1 = (x1,y1)和P2 = (x2, y2),线段P1P2上,除P1和P2以外一共有几个格点?
输入:
1 11
5 3
输出:
3
#include <cstdio>
#include <algorithm>
#include <cmath>
using namespace std;
int gcd(int a, int b)
{
if (b == 0)
return a;
return gcd(b, a % b);
}
int main()
{
int x1, y1, x2, y2;
int a, b;
scanf("%d%d%d%d", &x1, &y1, &x2, &y2);
a = abs(x1 - x2);
b = abs(y1 - y2);
printf("%d\n", gcd(a, b) - 1);
return 0;
}
2.扩展欧几里得算法
例:双六
题意:一个双六上面有向前向后无限延续的格子,每个格子都写有整数。其中0号格子是起点,1号格子是终点。而骰子上只有a, b, -a, -b四个整数,所以根据a和b的值的不同
,有可能无法到达终点。
掷出四个整数各多少次可以到达终点呢?如果解不唯一,输出任何一组皆可。如果无解,输出-1。
int extgcd(int a, int b, int& x, int& y)
{
int d = a;
if (b != 0){
d = extgcd(b, a % b, y, x);
y -= (a / b) * x;
}
else{
x = 1;
y = 0;
}
return d;
}