C++题目:最大公约数

最大公约数

题目描述

对两个正整数,能同时整除两个数的正整数称作两者的“公约数”,例如 2 2 2能同时整除 16 16 16 28 28 28,故 2 2 2 16 16 16 28 28 28的公约数。类似的, 1 , 4 1,4 1,4也是 16 16 16 28 28 28的公约数。

两个正整数的“最大公约数”为两个数的“公约数”中最大者, m , n m,n m,n的最的最大公约数一般记为 ( m , n ) (m,n) (m,n) g c d ( m , n ) {\rm gcd}(m,n) gcd(m,n)。例如 g c d ( 28 , 16 ) = 4 {\rm gcd}(28,16)=4 gcd(28,16)=4 g c d ( 15 , 49 ) = 1 {\rm gcd}(15,49)=1 gcd(15,49)=1

请计算两个数 n , m n,m n,m的最大公约数。注意 n , m n,m n,m可能会很大,需要使用long long类型。

输入格式

一行,两个整数 n , m n,m n,m,用单个空格隔开。

输出格式

n , m n,m n,m的最大公约数。

样例 #1

样例输入 #1

16 28

样例输出 #1

4

样例 #2

样例输入 #2

100 99

样例输出 #2

1

提示

1 ≤ n , m ≤ 1 0 18 1\le n, m \le 10^{18} 1n,m1018

答案

做法一(枚举法)

//可能会超时
#include<bits/stdc++.h>
using namespace std;

int main(){
	long long t=0x,y;
	cin >> x >> y;
    for(t=x; ;t--)
    {
		if(x%t == 0 && y%t==0) 
	   		break; 
   	}
   	cout << t;
	return 0;
}

做法二(辗转相减法)

//也会超时
#include<bits/stdc++.h>
using namespace std;

int main(){
    int a,b;
    cin >> a >> b;
	while(a != b)
	{
		if(a>b)
		{
			a = a - b;
		}
		else 
		{
			b = b - a;
		}
	}
	cout << a;
	return 0;
}

做法三(辗转相除法)

//或许是最优解
#include<bits/stdc++.h>
using namespace std;

int main(){
	long long x,y;
	cin >> x >> y;
	long long t = y;
	while(x%y!=0)
	{
		t = x%y;
		x = y;
		y = t;	
	}
	cout << t;
	return 0;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值