除法那里不知怎么了,死活进不去
#include<bits/stdc++.h>
using namespace std;
#define int long long
struct bigint {
int len;
short num[100100];
};
string sa, sb;
bigint a, b, tot;
void print(bigint x) {
for (int i = x.len; i > 0; i--) {
cout << x.num[i];
}
cout << '\n';
return;
}
bool over(bigint x, bigint y) { //x大于y
if (x.len > y.len)return 1;
if (x.len < y.len)return 0;
for (int i = x.len; i >= 1; i--) {
if (x.num[i] > y.num[i])return 1;
if (x.num[i] < y.num[i])return 0;
}
return 0;
}
bigint add(bigint x, bigint y) {
bigint ans;
memset(ans.num, 0, sizeof(ans.num));
ans.len = max(x.len, y.len);
for (int i = 1; i <= ans.len; i++) {
ans.num[i] += x.num[i] + y.num[i];
if (ans.num[i] >= 10) {
ans.num[i + 1] += ans.num[i] / 10;
ans.num[i] %= 10;
}
}
if (ans.num[ans.len + 1])ans.len++;
return ans;
}
bigint cross(bigint x, bigint y) {
bigint ans;
memset(ans.num, 0, sizeof(ans.num));
ans.len = x.len + y.len - 1;
for (int i = 1; i <= x.len; i++) {
for (int j = 1; j <= y.len; j++) {
ans.num[i + j - 1] += x.num[i] * y.num[j];
if (ans.num[i + j - 1] >= 10) {
ans.num[i + j] += ans.num[i + j - 1] / 10;
ans.num[i + j - 1] %= 10;
}
}
}
if (ans.num[x.len + y.len])ans.len++;
while (ans.num[ans.len] == 0 && ans.len > 1)ans.len--;
return ans;
}
bigint sub(bigint x, bigint y) {
bigint ans;
memset(ans.num, 0, sizeof(ans.num));
if (over(y, x) ){
cout << "-";
swap(x,y);
}
for (int i = 1; i <= x.len; i++) {
ans.num[i] = x.num[i] - y.num[i];
}
for (int i = 1; i <= x.len; i++) {
if (ans.num[i] < 0) {
ans.num[i] += 10;
ans.num[i + 1] -= 1;
}
}
ans.len = x.len;
while (ans.num[ans.len] == 0 && ans.len > 1)ans.len--;
return ans;
}
bigint half(bigint x) {
bigint ans = x;
ans.len = x.len;
if (x.num[x.len] < 2 && ans.len > 1)ans.len--;
for (int i = x.len; i > 1; i--) {
ans.num[i - 1] += ans.num[i] % 2 * 10;
ans.num[i] /= 2;
}
ans.num[1] /= 2;
return ans;
}
bigint mod(bigint x, bigint y) {
// cout << "OK";
bigint l, r = x, t, ans;
l.len = 1;l.num[1] = 0;
t.len = 1;t.num[1] = 1;
while (!over(l, r)) { //while(l<=r)
bigint mid = half(add(l, r));
if (!over(cross(mid, y), x)) {
ans = mid;
l = add(mid, t);
} else {
r = sub(mid, t);
}
}
return ans;
}
signed main() {
cin >> sa >> sb;
a.len = sa.size();
for (int i = a.len - 1, j = 1; i >= 0; i--, j++) {
a.num[j] = sa[i] - '0';
}
b.len = sb.size();
for (int i = b.len - 1, j = 1; i >= 0; i--, j++) {
b.num[j] = sb[i] - '0';
}
tot = add(a, b);
print(tot);
tot = sub(a, b);
print(tot);
tot = cross(a, b);
print(tot);
tot = mod(a, b);
print(tot);
print(sub(a,cross(b,tot)));
return 0;
}