最大公约数(GCD)

题目描述

求整数a、b的最大公约数。

题目分析

所谓求整数a、b的最大公约数,就是求同时满足a%c=0、b%c=0的最大正整数c,即求能够同时整除a和b的最大正整数c。

暴力枚举

若a、b均不为0,则依次遍历不大于a(或b)的所有正整数,依次试验它是否同时满足两式,并在所有满足两式的正整数中挑选最大的那个即为所求;

若a、b其中有一个为0,那么最大公约数即为a、b中非零的那个;

若a、b均为0,则最大公约数不存在(任意数均可同时整除它们)。

说明:当a和b数值较大时(如100000000),该算法耗时较多。

欧几里德算法(又称辗转相除法)

若a、b全为0,则它们的最大公约数不存在;若a、b其中之一为0,则它们的最大公约数为非0的那个;若a、b都不为0,则使新a=b;新b=a%b然后重复该过程。

说明:证明过程见最下边。

代码实现

递归实现
#include <iostream>
using namespace std;

int gcd(int a, int b)
{
	if (a == 0 && b == 0)
		return -1; // 不存在

	// a、b为负数时,先求绝对值,再求最大公约数
	if (a < 0)
		a = -a;
	if (b < 0)
		b = -b;

	if (b == 0)
		return a;
	return gcd(b, a%b);
}

int main()
{
	int m, n;
	while (cin >> m >> n)
	{
		cout << gcd(m, n) << endl;
	}
	return 0;
}
循环实现
#include <iostream>
using namespace std;

int gcd(int a, int b)
{
	if (a == 0 && b == 0)
		return -1; // 不存在

	// a、b为负数时,先求绝对值,再求最大公约数
	if (a < 0)
		a = -a;
	if (b < 0)
		b = -b;

	while (b != 0)
	{
		int t = a%b;
		a = b;
		b = t;
	}
	return a;
}

int main()
{
	int m, n;
	while (cin >> m >> n)
	{
		cout << gcd(m, n) << endl;
	}
	return 0;
}

欧几里德算法证明

1> 证明a、b的公约数同时也是b、a mod b 的公约数

2> 证明若g是a、b的最大公约数,它同样也是b、a mod b 的最大公约数

我们假设g是a、b的最大公约数,但它并不是b、a mod b 的最大公约数,

时间: 2024-10-11 12:34:01

最大公约数(GCD)的相关文章

1011 最大公约数GCD

1011 最大公约数GCD 基准时间限制:1 秒 空间限制:131072 KB 输入2个正整数A,B,求A与B的最大公约数. Input 2个数A,B,中间用空格隔开.(1<= A,B <= 10^9) Output 输出A与B的最大公约数. Input示例 30 105 Output示例 15 import java.util.Scanner; public class Main { static int gcd(int a,int b){ return a%b==0? b:gcd(b,a%

1011 最大公约数GCD(51NOD基础题)

1011 最大公约数GCD(51NOD基础题) 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题 输入2个正整数A,B,求A与B的最大公约数. Input 2个数A,B,中间用空格隔开.(1<= A,B <= 10^9) Output 输出A与B的最大公约数. Input示例 30 105 Output示例 15 /* <1> 循环实现 辗转相除法 <2> 递归实现 辗转相除法 */ #include <cstdio> #defi

51nod 1011最大公约数GCD

1011 最大公约数GCD 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题  收藏  关注 输入2个正整数A,B,求A与B的最大公约数. Input 2个数A,B,中间用空格隔开.(1<= A,B <= 10^9) Output 输出A与B的最大公约数. Input示例 30 105 Output示例 15百度~辗转相除法,嗯,wrong了4遍(逃) #include<stdio.h> int gcd(int a,int b) { int t; if(

最大公约数(Gcd)算法(Euclid)

转载自农夫三拳的一篇文章 欧几里德算法和扩展欧几里德算法 欧几里德算法又称辗转相除法,用于计算两个整数a,b的最大公约数.其计算原理依赖于下面的定理: 定理:gcd(a,b) = gcd(b,a mod b) 证明:a可以表示成a = kb + r,则r = a mod b 假设d是a,b的一个公约数,则有 d|a, d|b,而r = a - kb,因此d|r 因此d是(b,a mod b)的公约数 假设d 是(b,a mod b)的公约数,则 d|b , d|r ,但是a = kb + r 因

52nod 1011 最大公约数GCD

输入2个正整数A,B,求A与B的最大公约数. Input 2个数A,B,中间用空格隔开.(1<= A,B <= 10^9) Output 输出A与B的最大公约数. Input示例 30 105 Output示例 15 水题~~~~~~~ #include <iostream> #include <string.h> #include <algorithm> #include <stdio.h> using namespace std; long

最大公约数gcd和最小公倍数lcm

gcd(a, b),就是求a和b的最大公约数 lcm(a, b),就是求a和b的最小公倍数 然后有个公式 a*b = gcd * lcm     ( gcd就是gcd(a, b), ( •?∀•? ) 简写你懂吗) 解释(不想看就跳过){ 首先,求一个gcd,然后... a / gcd 和 b / gcd 这两个数互质了,也就是 gcd(   a / gcd ,b / gcd  )  =  1,然后... lcm = gcd *  (a / gcd) * (b / gcd) lcm = (a *

(hdu 2.1.4)又见GCD(求最大公约数GCD的变化题)

题目: 又见GCD Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 2685 Accepted Submission(s): 1327   Problem Description 有三个正整数a,b,c(0<a,b,c<10^6),其中c不等于b.若a和c的最大公约数为b,现已知a和b,求满足条件的最小的c. Input 第一行输入一个n,

计算两个数的最大公约数 gcd(a,b) &amp;&amp; 证明欧几里得算法

求两个数a和b的最大公约数,可以想到的是从[1,min(a,b)]枚举每个正整数: #include<iostream> using namespace std; int gcd(int a,int b) { int ans=1; for(int i=2;i<=min(a,b);++i) { if(a%i==0 && b%i==0) ans=i; } return ans; } int main() { int a,b; cin>>a>>b; co

浅谈Stein算法求最大公约数(GCD)的原理及简单应用

一.Stein算法过程及其简单证明 1.一般步骤: s1:当两数均为偶数时将其同时除以2至至少一数为奇数为止,记录除掉的所有公因数2的乘积k: s2:如果仍有一数为偶数,连续除以2直至该数为奇数为止: s3:用更相减损法(辗转相减法),即GCD(a,b)=GCD(a-b,b)求出两奇数的最大公约数d: s4:原来两数的最大公约数即为d*k: 2.简单证明: s1:即为求出两数为2的幂次方的最大公因数k: s2:当化简后两数一奇一偶时,显然奇数是不含偶数因子的,那么另一化简后偶数的所有偶数因子都不

[算法]求满足要求的进制(辗转相除(欧几里得算法),求最大公约数gcd)

题目 3在十进制下满足若各位和能被3整除,则该数能被3整除. 5在十六进制下也满足此规律. 给定数字k,求多少进制(1e18进制范围内)下能满足此规律,找出一个即可,无则输出-1. 题解 写写画画能找到规律,即是求与k互质的数x,x进制下即能满足上述规律. 相关 求最大公约数:辗转相除法(又叫欧几里得算法) 欧几里德定理:gcd(a, b) = gcd(b , a mod b) ,对于正整数a.b. 其中a.b大小无所谓.当a值小于b值时,算法的下一次递归调用就能够将a和b的值交换过来. 代码