求最大公约数——辗转相除法
设求a和b的最大公约数c
则可看做边长分别为a和b的矩形,可恰好被边长为c的正方形无缝隙填满
方法:不断地用长边除以短边取余数,直到长边与短边相等,即为所求正方形
solve(a,b)=solve(b,a%b)=…… ……=solve(c,0)
代码:
int solve(int a, int b) {
if (b == 0) return a;
else return solve(b, a%b);
}
例题:
求线段上格点的个数
给定平面上的两个格点P1=(x1,y1)P2=(x2,y2),线段P1P2上,除P1和P2以外一共有几个点。
示例:
P1=(3,9) P2=(7,1)
则求出7-3和9-1的最小公倍数为solve(8,4)
小矩形的边长为分别为8/solve(8,4)和4/solve(8,4)
#include"stdio.h"
#include"stdlib.h"
int x1, y1;
int x2, y2;
int max(int a, int b) {
return a > b ? a : b;
}
int min(int a,int b) {
return a > b ? b : a;
}
int solve(int a, int b) {
if (b == 0) return a;
else return solve(b, a%b);
}
int main() {
int dx, dy;
scanf_s("%d%d", &x1, &y1);
scanf_s("%d%d", &x2, &y2);
dx = max(x1, x2) - min(y1, y2);
dy = max(y1, y2) - min(y1, y2);
printf("%d", solve(dx, dy)-1);
system("pause");
}
来源:CSDN
作者:Jas_sober
链接:https://blog.csdn.net/qq_45769877/article/details/104057666