小红的 gcd
时间限制:1秒 空间限制:256M
网页链接
牛客tracker
牛客tracker & 每日一题,完成每日打卡,即可获得牛币。获得相应数量的牛币,能在【牛币兑换中心】,换取相应奖品!助力每日有题做,丰盈牛币日益多!

题目描述
给两个正整数 a , b a,b a,b,输出他们的最大公约数 g c d ( a , b ) gcd(a,b) gcd(a,b)。
输入描述:
第一行一个正整数
a
a
a。
第二行一个正整数
b
b
b。
l
e
n
len
len 表示
a
a
a 的十进制位数,
1
≤
l
e
n
≤
1
0
6
1≤len≤10^6
1≤len≤106 。
1≤b≤1091≤b≤109。
输出描述:
输出一个整数,表示 g c d ( a , b ) gcd(a,b) gcd(a,b)。
示例1
输入:
12345678
12
输出:
6
解题思路
由于 a a a 的位数可达 1 e 6 1e6 1e6 无法直接存储为整数,先将 a a a 以字符串形式读取,逐位计算 a a a 对 b b b 取模的结果 t t t( t t t 初始为 0 0 0 ,每次更新为( t ∗ 10 t*10 t∗10 + + + 字符转数字) % b b b);再通过欧几里得算法计算t和b的最大公约数,该结果即为 g c d ( a , b ) gcd(a,b) gcd(a,b)——因为 g c d ( a , b ) = g c d ( a gcd(a,b)=gcd(a gcd(a,b)=gcd(a % b , b ) b,b) b,b),此方法避免了处理超大整数,适配 a a a 的超长位数和 b ≤ 1 e 9 b≤1e9 b≤1e9 的输入规模,高效求解最大公约数。
代码内容
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<ll,ll> pii;
const ll N=1e5+10;
ll gcd(ll x,ll y)
{
return y?gcd(y,x%y):x;
}
int main()
{
string a;
ll b,t=0;
cin>>a>>b;
for(auto c:a) t=(t*10+(c-'0'))%b;
ll ans=gcd(t,b);
cout<<ans<<endl;
return 0;
}
1654

被折叠的 条评论
为什么被折叠?



