求最大公约数——辗转相除法

蓝咒 提交于 2020-01-21 22:25:09

求最大公约数——辗转相除法

设求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");
}

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!