#include <bits/stdc++.h>
using namespace std;
int a[2000], b[2000], maxnum = 1e8;
void jtll(int tmp[]) {
string s;
cin >> s;
int len = s.length(), cnt = 0, ans = 0, t = 1, y = 1;
for (int i = len - 1; i >= 0; i--) {
cnt++;
ans += t * (s[i] - 48);
t *= 10;
if (cnt == 8) {
tmp[y++] = ans;
ans = 0;
cnt = 0;
t = 1;
}
}
if (cnt > 0)
tmp[y] = ans;
tmp[0] = (len + 7) / 8;
}
bool dlb() {
if (a[0] > b[0])
return true;
if (a[0] < b[0])
return false;
for (int i = a[0]; i > 0; i--)
if (a[i] > b[i])
return true;
else if (a[i] < b[i])
return false;
return true;
}
void SB(int a[], int b[]) {
for (int i = 1; i <= a[0]; i++) {
a[i] -= b[i];
if (a[i] < 0)
a[i] += maxnum, a[i + 1]--;
}
while (a[a[0]] == 0 and a[0] > 0)
a[0]--;
}
void jntm(int a[]) {
for (int i = a[0]; i >= 1; i--) {
a[i - 1] += (a[i] % 2) * maxnum;
a[i] /= 2;
}
while (a[a[0]] == 0 and a[0] > 0)
a[0]--;
}
void muti(int a[], int m) {
int g = 0;
for (int i = 1; i <= a[0]; i++) {
int x = a[i] * m + g;
a[i] = x % maxnum;
g = x / maxnum;
if (i == a[0] and g > 0)
a[0]++;
}
}
void print(int a[]) {
for (int i = a[0]; i > 0; i--)
if (i == a[0])
cout << a[i];
else
cout << setw(8) << setfill('0') << a[i];
}
int main() {
jtll(a);
jtll(b);
int timer = 1;
while (true) {
if (a[1] % 2 == 0 and b[1] % 2 == 0) {
jntm(a);
jntm(b);
timer *= 2;
continue;
} else if (a[1] % 2 == 0) {
jntm(a);
continue;
} else if (b[1] % 2 == 0) {
jntm(b);
continue;
}
if (dlb()) {
SB(a, b);
if (a[0] == 0) {
muti(b, timer);
print(b);
break;
}
} else {
SB(b, a);
if (b[0] == 0) {
muti(a, timer);
print(a);
break;
}
}
}
return 0;
}
一本通1627:【例 3】最大公约数
最新推荐文章于 2025-05-12 19:20:28 发布