题目链接:
分析:
计算一个大数与小数的gcd,普通的欧几里得算法必然超时。(亲测python也会超时)
我们可以使用逐位取模的方法将大数运算控制在10^9的范围内,即不断对b取模。
流程如下:
- 初始化
amodb
为 0,这个变量用于存储字符串a
的数字按位取模b
后的结果。 - 遍历字符串
a
中的每个字符c
,将字符转换为对应的数字(通过c - '0'
),然后将其加到amodb
中。在这个过程中,每次累加前都会将当前的amodb
乘以 10(因为我们是按十进制处理数字),然后取模b
。这个过程实际上是在计算字符串a
表示的数字对b
的余数。 - 最后,输出
b
和amodb
的最大公约数。
AC代码:
#include<bits/stdc++.h>
using namespace std;
string a;
long long b;
int gcd(int a,int b){
return b?gcd(b,a%b):a;
}
int main(){
cin>>a>>b;
long long amodb = 0;
for(auto it : a){
amodb = (amodb * 10 + (it-'0')) % b;
}
cout<<gcd(b,amodb)<<endl;
return 0;
}