Editorial for Xử lý số nguyên lớn
Remember to use this editorial only when stuck, and not to copy-paste code from it. Please be respectful to the problem author and editorialist.
Submitting an official solution before solving the problem yourself is a bannable offence.
Submitting an official solution before solving the problem yourself is a bannable offence.
Lưu ý: Các code mẫu dưới đây chỉ mang tính tham khảo và có thể không AC được bài tập này
Code mẫu của flashmt
const base=100000000; digit=8; maxk=130000; type bignum=array[0..maxk] of int64; var a,b,c,d,re:bignum; e:array[1..1000] of char; bg:boolean; procedure rf(var a:bignum); var s:string; i,m,j:longint; c:char; code:integer; t:int64; begin fillchar(a,sizeof(a),0); while not eoln do begin inc(a[0]); read(e[a[0]]); end; m:=a[0] mod digit; if m=0 then m:=digit; a[0]:=(a[0]+digit-1) div digit; s:=''; for i:=1 to m do s:=s+e[i]; val(s,t,code); a[a[0]]:=t; for i:=0 to a[0]-2 do begin s:=''; for j:=1 to digit do s:=s+e[m+j+i*digit]; val(s,t,code); a[a[0]-i-1]:=t; end; end; function big:boolean; var i:longint; begin big:=a[0]>b[0]; if a[0]=b[0] then begin big:=true; for i:=a[0] downto 1 do if a[i]>b[i] then break else begin if a[i]<b[i] then begin big:=false; break; end; end; end; end; procedure wr(var k:bignum); var s:string; t,j,i:longint; begin for i:=k[0] downto 1 do begin if i<k[0] then begin str(k[i],s); t:=length(s); for j:=t+1 to digit do write(0); end; write(k[i]); end; writeln; end; procedure plus; var i,max:longint; mem:int64; begin fillchar(c,sizeof(c),0); mem:=0; if a[0]>b[0] then max:=a[0] else max:=b[0]; for i:=1 to max do begin c[i]:=(a[i]+b[i]+mem) mod base; mem:=(a[i]+b[i]+mem) div base; end; if mem>0 then begin inc(max); c[max]:=mem; end; c[0]:=max; wr(c); end; procedure minus; var i,max:longint; mem:int64; begin fillchar(c,sizeof(c),0); mem:=0; if not bg then begin write('-'); d:=a; a:=b; b:=d; end; max:=a[0]; for i:=1 to a[0] do begin if a[i]<b[i]+mem then begin c[i]:=a[i]+base-b[i]-mem; mem:=1; end else begin c[i]:=a[i]-b[i]-mem; mem:=0; end; end; while (c[max]=0) and (max>1) do dec(max); c[0]:=max; wr(c); end; procedure multi; var i,j,max,maxr:longint; mem,t:int64; begin fillchar(re,sizeof(re),0); maxr:=a[0]; for i:=1 to b[0] do begin mem:=0; fillchar(c,sizeof(c),0); c[0]:=a[0]; for j:=1 to a[0] do begin c[j]:=(a[j]*b[i]+mem) mod base; mem:=(a[j]*b[i]+mem) div base; end; if mem>0 then begin inc(c[0]); c[c[0]]:=mem; end; mem:=0; for j:=1 to c[0] do begin t:=c[j]+re[j+i-1]+mem; re[j+i-1]:=t mod base; mem:=t div base; end; j:=c[0]+i-1; if j>maxr then maxr:=j; while mem>0 do begin inc(j); if j>maxr then maxr:=j; t:=mem+re[j]; re[j]:=t mod base; mem:=t div base; end; end; re[0]:=maxr; wr(re); end; begin rf(a); readln; rf(b); bg:=big; plus; minus; multi; end.
Code mẫu của happyboy99x
a=int(input()) b=int(input()) print(a+b) print(a-b) print(a*b)
Code mẫu của ladpro98
#include <bits/stdc++.h> using namespace std; // * BIG INTEGER typedef vector<int> bigInt; const int BASE = 1000; const int LENGTH = 3; // * Refine function bigInt& fix(bigInt &a) { a.push_back(0); for (int i = 0; i + 1 < a.size(); ++i) { a[i + 1] += a[i] / BASE; a[i] %= BASE; if (a[i] < 0) a[i] += BASE, --a[i + 1]; } while (a.size() > 1 && a.back() == 0) a.pop_back(); return a; } // * Constructors bigInt big(int x) { bigInt result; while (x > 0) { result.push_back(x % BASE); x /= BASE; } return result; } bigInt big(string s) { bigInt result(s.size() / LENGTH + 1); for (int i = 0; i < s.size(); ++i) { int pos = (s.size() - i - 1) / LENGTH; result[pos] = result[pos] * 10 + s[i] - '0'; } return fix(result), result; } // * Compare operators int compare(bigInt &a, bigInt &b) { if (a.size() != b.size()) return (int)a.size() - (int)b.size(); for (int i = 0; i < a.size(); ++i) if (a[i] != b[i]) return a[i] - b[i]; return 0; } #define DEFINE_OPERATOR(x) bool operator x (bigInt &a, bigInt &b) { return compare(a, b) x 0; } DEFINE_OPERATOR(==) DEFINE_OPERATOR(!=) DEFINE_OPERATOR(>) DEFINE_OPERATOR(<) DEFINE_OPERATOR(>=) DEFINE_OPERATOR(<=) #undef DEFINE_OPERATOR // * Arithmetic operators void operator += (bigInt &a, bigInt b) { a.resize(max(a.size(), b.size())); for (int i = 0; i < b.size(); ++i) a[i] += b[i]; fix(a); } void operator -= (bigInt &a, bigInt b) { for (int i = 0; i < b.size(); ++i) a[i] -= b[i]; fix(a); } void operator *= (bigInt &a, int b) { for (int i = 0; i < a.size(); ++i) a[i] *= b; fix(a); } void divide(bigInt a, int b, bigInt &q, int &r) { for (int i = int(a.size()) - 1; i >= 0; --i) { r = r * BASE + a[i]; q.push_back(r / b); r %= b; } reverse(q.begin(), q.end()); fix(q); } bigInt operator + (bigInt a, bigInt b) { a += b; return a; } bigInt operator - (bigInt a, bigInt b) { a -= b; return a; } bigInt operator * (bigInt a, int b) { a *= b; return a; } bigInt operator / (bigInt a, int b) { bigInt q; int r = 0; divide(a, b, q, r); return q; } int operator % (bigInt a, int b) { bigInt q; int r = 0; divide(a, b, q, r); return r; } bigInt operator * (bigInt a, bigInt b) { bigInt result (a.size() + b.size()); for (int i = 0; i < a.size(); ++i) for (int j = 0; j < b.size(); ++j) result[i + j] += a[i] * b[j]; return fix(result); } // * I/O routines istream& operator >> (istream& cin, bigInt &a) { string s; cin >> s; a = big(s); return cin; } ostream& operator << (ostream& cout, const bigInt &a) { cout << a.back(); for (int i = (int)a.size() - 2; i >= 0; --i) cout << setw(LENGTH) << setfill('0') << a[i]; return cout; } int main() { bigInt a, b; cin >> a >> b; cout << a + b << endl; if (a < b) cout << '-' << b - a << endl; else cout << a - b << endl; cout << a * b << endl; return 0; }
Code mẫu của RR
#include <vector> #include <cstdlib> #include <iostream> #include <iomanip> #include <string> #include <ctime> using namespace std; // base and base_digits must be consistent const int base = 1000000000; const int base_digits = 9; struct bigint { vector<int> a; int sign; bigint() : sign(1) { } bigint(long long v) { *this = v; } bigint(const string &s) { read(s); } void operator=(const bigint &v) { sign = v.sign; a = v.a; } void operator=(long long v) { sign = 1; if (v < 0) sign = -1, v = -v; for (; v > 0; v = v / base) a.push_back(v % base); } bigint operator+(const bigint &v) const { if (sign == v.sign) { bigint res = v; for (int i = 0, carry = 0; i < (int) max(a.size(), v.a.size()) || carry; ++i) { if (i == (int) res.a.size()) res.a.push_back(0); res.a[i] += carry + (i < (int) a.size() ? a[i] : 0); carry = res.a[i] >= base; if (carry) res.a[i] -= base; } return res; } return *this - (-v); } bigint operator-(const bigint &v) const { if (sign == v.sign) { if (abs() >= v.abs()) { bigint res = *this; for (int i = 0, carry = 0; i < (int) v.a.size() || carry; ++i) { res.a[i] -= carry + (i < (int) v.a.size() ? v.a[i] : 0); carry = res.a[i] < 0; if (carry) res.a[i] += base; } res.trim(); return res; } return -(v - *this); } return *this + (-v); } void operator*=(int v) { if (v < 0) sign = -sign, v = -v; for (int i = 0, carry = 0; i < (int) a.size() || carry; ++i) { if (i == (int) a.size()) a.push_back(0); long long cur = a[i] * (long long) v + carry; carry = (int) (cur / base); a[i] = (int) (cur % base); //asm("divl %%ecx" : "=a"(carry), "=d"(a[i]) : "A"(cur), "c"(base)); } trim(); } bigint operator*(int v) const { bigint res = *this; res *= v; return res; } friend pair<bigint, bigint> divmod(const bigint &a1, const bigint &b1) { int norm = base / (b1.a.back() + 1); bigint a = a1.abs() * norm; bigint b = b1.abs() * norm; bigint q, r; q.a.resize(a.a.size()); for (int i = a.a.size() - 1; i >= 0; i--) { r *= base; r += a.a[i]; int s1 = r.a.size() <= b.a.size() ? 0 : r.a[b.a.size()]; int s2 = r.a.size() <= b.a.size() - 1 ? 0 : r.a[b.a.size() - 1]; int d = ((long long) base * s1 + s2) / b.a.back(); r -= b * d; while (r < 0) r += b, --d; q.a[i] = d; } q.sign = a1.sign * b1.sign; r.sign = a1.sign; q.trim(); r.trim(); return make_pair(q, r / norm); } bigint operator/(const bigint &v) const { return divmod(*this, v).first; } bigint operator%(const bigint &v) const { return divmod(*this, v).second; } void operator/=(int v) { if (v < 0) sign = -sign, v = -v; for (int i = (int) a.size() - 1, rem = 0; i >= 0; --i) { long long cur = a[i] + rem * (long long) base; a[i] = (int) (cur / v); rem = (int) (cur % v); } trim(); } bigint operator/(int v) const { bigint res = *this; res /= v; return res; } int operator%(int v) const { if (v < 0) v = -v; int m = 0; for (int i = a.size() - 1; i >= 0; --i) m = (a[i] + m * (long long) base) % v; return m * sign; } void operator+=(const bigint &v) { *this = *this + v; } void operator-=(const bigint &v) { *this = *this - v; } void operator*=(const bigint &v) { *this = *this * v; } void operator/=(const bigint &v) { *this = *this / v; } bool operator<(const bigint &v) const { if (sign != v.sign) return sign < v.sign; if (a.size() != v.a.size()) return a.size() * sign < v.a.size() * v.sign; for (int i = a.size() - 1; i >= 0; i--) if (a[i] != v.a[i]) return a[i] * sign < v.a[i] * sign; return false; } bool operator>(const bigint &v) const { return v < *this; } bool operator<=(const bigint &v) const { return !(v < *this); } bool operator>=(const bigint &v) const { return !(*this < v); } bool operator==(const bigint &v) const { return !(*this < v) && !(v < *this); } bool operator!=(const bigint &v) const { return *this < v || v < *this; } void trim() { while (!a.empty() && !a.back()) a.pop_back(); if (a.empty()) sign = 1; } bool isZero() const { return a.empty() || (a.size() == 1 && !a[0]); } bigint operator-() const { bigint res = *this; res.sign = -sign; return res; } bigint abs() const { bigint res = *this; res.sign *= res.sign; return res; } long long longValue() const { long long res = 0; for (int i = a.size() - 1; i >= 0; i--) res = res * base + a[i]; return res * sign; } friend bigint gcd(const bigint &a, const bigint &b) { return b.isZero() ? a : gcd(b, a % b); } friend bigint lcm(const bigint &a, const bigint &b) { return a / gcd(a, b) * b; } void read(const string &s) { sign = 1; a.clear(); int pos = 0; while (pos < (int) s.size() && (s[pos] == '-' || s[pos] == '+')) { if (s[pos] == '-') sign = -sign; ++pos; } for (int i = s.size() - 1; i >= pos; i -= base_digits) { int x = 0; for (int j = max(pos, i - base_digits + 1); j <= i; j++) x = x * 10 + s[j] - '0'; a.push_back(x); } trim(); } friend istream& operator>>(istream &stream, bigint &v) { string s; stream >> s; v.read(s); return stream; } friend ostream& operator<<(ostream &stream, const bigint &v) { if (v.sign == -1) stream << '-'; stream << (v.a.empty() ? 0 : v.a.back()); for (int i = (int) v.a.size() - 2; i >= 0; --i) stream << setw(base_digits) << setfill('0') << v.a[i]; return stream; } static vector<int> convert_base(const vector<int> &a, int old_digits, int new_digits) { vector<long long> p(max(old_digits, new_digits) + 1); p[0] = 1; for (int i = 1; i < (int) p.size(); i++) p[i] = p[i - 1] * 10; vector<int> res; long long cur = 0; int cur_digits = 0; for (int i = 0; i < (int) a.size(); i++) { cur += a[i] * p[cur_digits]; cur_digits += old_digits; while (cur_digits >= new_digits) { res.push_back(int(cur % p[new_digits])); cur /= p[new_digits]; cur_digits -= new_digits; } } res.push_back((int) cur); while (!res.empty() && !res.back()) res.pop_back(); return res; } typedef vector<long long> vll; static vll karatsubaMultiply(const vll &a, const vll &b) { int n = a.size(); vll res(n + n); if (n <= 32) { for (int i = 0; i < n; i++) for (int j = 0; j < n; j++) res[i + j] += a[i] * b[j]; return res; } int k = n >> 1; vll a1(a.begin(), a.begin() + k); vll a2(a.begin() + k, a.end()); vll b1(b.begin(), b.begin() + k); vll b2(b.begin() + k, b.end()); vll a1b1 = karatsubaMultiply(a1, b1); vll a2b2 = karatsubaMultiply(a2, b2); for (int i = 0; i < k; i++) a2[i] += a1[i]; for (int i = 0; i < k; i++) b2[i] += b1[i]; vll r = karatsubaMultiply(a2, b2); for (int i = 0; i < (int) a1b1.size(); i++) r[i] -= a1b1[i]; for (int i = 0; i < (int) a2b2.size(); i++) r[i] -= a2b2[i]; for (int i = 0; i < (int) r.size(); i++) res[i + k] += r[i]; for (int i = 0; i < (int) a1b1.size(); i++) res[i] += a1b1[i]; for (int i = 0; i < (int) a2b2.size(); i++) res[i + n] += a2b2[i]; return res; } bigint operator*(const bigint &v) const { vector<int> a6 = convert_base(this->a, base_digits, 6); vector<int> b6 = convert_base(v.a, base_digits, 6); vll a(a6.begin(), a6.end()); vll b(b6.begin(), b6.end()); while (a.size() < b.size()) a.push_back(0); while (b.size() < a.size()) b.push_back(0); while (a.size() & (a.size() - 1)) a.push_back(0), b.push_back(0); vll c = karatsubaMultiply(a, b); bigint res; res.sign = sign * v.sign; for (int i = 0, carry = 0; i < (int) c.size(); i++) { long long cur = c[i] + carry; res.a.push_back((int) (cur % 1000000)); carry = (int) (cur / 1000000); } res.a = convert_base(res.a, 6, base_digits); res.trim(); return res; } }; int main() { ios :: sync_with_stdio(false); string A, B; cin >> A >> B; bigint a(A); bigint b(B); cout << a + b << endl; cout << a - b << endl; cout << a * b << endl; }
Code mẫu của hieult
#include <cstdlib> #include <iostream> using namespace std; int a[3000],b[3000],c[3000],_a[3000],_b[3000],_c[3000],ti[3000],hi[3000],to[3000]; int a1,b1,c1,i,_a1,_b1,_c1; int tong() { long tong,nho=0; int i,j; //int a[1000], b[1000], c[1000],a1, b1, c1; a1=_a1; b1=_b1; for (i=1; i<=a1; i++) a[i]=_a[i]; for (i=1; i<=b1; i++) b[i]=_b[i]; for (i=1; i<=a1; i++) c[i]=a[i]; for (i=1; i<=a1; i++) a[i]=c[a1-i+1]; for (i=1; i<=b1; i++) c[i]=b[i]; for (i=1; i<=b1; i++) b[i]=c[b1-i+1]; if (a1>b1) c1=a1; else c1=b1; for (i=a1+1; i<=c1; i++)a[i]=0; for (i=b1+1; i<=c1; i++)b[i]=0; for (i=1; i<=c1; i++) { tong=nho+a[i]+b[i]; c[i]=tong%10; nho=tong/10; } if (nho>0) c1++, c[c1]=nho; for (i=1; i<=c1; i++) a[i]=c[i]; for (i=1; i<=c1; i++) c[i]=a[c1-i+1]; for (i=1; i<=c1; i++) to[i]=c[i]; to[0]=c1; } int _hieu() { //int a[1000], b[1000], c[1000], a1, b1, c1; long tong,nho=0,dau=1; int i,j,tg; a1=_a1; b1=_b1; for (i=1; i<=a1; i++) a[i]=_a[i]; for (i=1; i<=b1; i++) b[i]=_b[i]; for (i=1; i<=a1; i++) c[i]=a[i]; for (i=1; i<=a1; i++) a[i]=c[a1-i+1]; for (i=1; i<=b1; i++) c[i]=b[i]; for (i=1; i<=b1; i++) b[i]=c[b1-i+1]; if (a1>b1) c1=a1; else c1=b1; for (i=a1+1; i<=c1; i++)a[i]=0; for (i=b1+1; i<=c1; i++)b[i]=0; for (i=c1; i>=1; i--) if (a[i]!=b[i]){ if (a[i]<b[i])dau=-1; else dau=1; break; } if (dau==-1){ for (i=1; i<=c1; i++){ tg=a[i]; a[i]=b[i]; b[i]=tg; } } for (i=1; i<=c1; i++){ tong=10+nho+a[i]-b[i]; c[i]=tong%10; if (tong/10>0) nho=0; else nho=-1; } while (c[c1]==0& c1>1)c1--; for (i=1; i<=c1; i++) a[i]=c[i]; for (i=1; i<=c1; i++) c[i]=a[c1-i+1]; hi[c1+1]=dau; hi[0]=c1; for (i=1; i<=c1; i++) hi[i]=c[i]; } int tich(){ //int a[1000], b[1000], c[1000], a1, b1, c1; long tong=0,nho=0; int i,j; a1=0;b1=0;c1=0; a1=_a1; b1=_b1; tong=0; nho=0; for (i=1; i<=a1; i++) a[i]=_a[i]; for (i=1; i<=b1; i++) b[i]=_b[i]; for (i=1; i<=a1; i++) c[i]=a[i]; for (i=1; i<=a1; i++) a[i]=c[a1-i+1]; for (i=1; i<=b1; i++) c[i]=b[i]; for (i=1; i<=b1; i++) b[i]=c[b1-i+1]; c1=a1+b1; for (i=1; i<=c1; i++) c[i]=0; for (i=1; i<=c1; i++){ tong=nho; for (j=1; j<=i; j++) tong = tong + a[j]*b[i+1-j]; c[i]=tong%10; nho=tong/10; } if (nho>0) c[c1]=nho; if (c[c1]==0) c1--; for (i=1; i<=c1; i++) a[i]=c[i]; for (i=1; i<=c1; i++) c[i]=a[c1-i+1]; ti[0]=c1; for (i=1; i<=c1; i++) ti[i]=c[i]; } int nhap(){ string st1,st2; char ch='a'; cin>>st1; cin>>st2; a1=st1.length(); b1=st2.length(); for (i=0; i<a1; i++) a[i+1]=short(st1[i])-48; for (i=0; i<b1; i++) b[i+1]=short(st2[i])-48; for (i=1; i<=a1; i++) _a[i]=a[i]; for (i=1; i<=b1; i++) _b[i]=b[i]; _a1=a1; _b1=b1; } int thu(){ tich(); tong(); _hieu(); for(i=1; i<=to[0]; i++) cout<<to[i]; cout<<endl; if (hi[hi[0]+1]==-1) cout<<"-"; for(i=1; i<=hi[0]; i++) cout<<hi[i]; cout<<endl; for(i=1; i<=ti[0]; i++) cout<<ti[i]; } int main(int argc, char *argv[]) { nhap(); thu(); //system("PAUSE"); return(0); }
Code mẫu của ll931110
Program BIGNUM; Const input = ''; output = ''; Type arr = array[1..2000] of longint; Var a,b,c: arr; k,m,n: integer; fa: text; ch: char; i: integer; Procedure init; Var f: text; i: integer; Begin m:= 0; n:= 0; Assign(f, input); Reset(f); While not eoln(f) do Begin inc(m); Read(f, ch); a[m]:= ord(ch) - 48; End; For i:= 1 to m do a[2000 - m + i]:= a[i]; m:= 2001 - m; Readln(f); While not eoln(f) do Begin inc(n); Read(f, ch); b[n]:= ord(ch) - 48; End; For i:= 1 to n do b[2000 - n + i]:= b[i]; n:= 2001 - n; Close(f); If m > n then k:= n else k:= m; End; Procedure printresult(p: integer); Var i: integer; Begin For i:= p to 2000 do write(fa, c[i]); Writeln(fa); End; Procedure add; Var i: integer; Begin Fillchar(c, sizeof(c), 0); For i:= 2000 downto k do Begin c[i]:= c[i] + (a[i] + b[i]); If c[i] > 9 then Begin inc(c[i - 1]); c[i]:= c[i] - 10; End; End; If c[k - 1] <> 0 then printresult(k - 1) else printresult(k); End; Procedure subtract(x,y: arr); Var s,i: integer; Begin Fillchar(c, sizeof(c), 0); For i:= 2000 downto k do Begin c[i]:= c[i] + (x[i] - y[i]); If c[i] < 0 then Begin dec(c[i - 1]); c[i]:= c[i] + 10; End; End; s:= k; While c[s] = 0 do inc(s); printresult(s); End; Procedure minus; Var d: integer; Begin d:= k; While (d <= 2000) and (a[d] = b[d]) do inc(d); If d > 2000 then writeln(fa, 0) else If a[d] > b[d] then subtract(a,b) else begin write(fa, '-'); subtract(b,a); end; End; Procedure multiply; Var i,j,t: integer; Begin Fillchar(c, sizeof(c), 0); For i:= 2000 downto m do For j:= 2000 downto n do Begin t:= i + j - 2000; c[t]:= c[t] + a[i] * b[j]; If c[t] > 9 then Begin c[t - 1]:= c[t - 1] + c[t] div 10; c[t]:= c[t] mod 10; End; End; t:= 1; While c[t] = 0 do inc(t); printresult(t); End; Begin init; Assign(fa, output); Rewrite(fa); add; minus; multiply; Close(fa); End.
Code mẫu của skyvn97
#include<stdio.h> #include<string.h> #include<algorithm> #define MAX 2611 using namespace std; struct bignum { int nd; int sb; int d[MAX]; bignum() { nd=0; } bignum(int x) { if (x==0) { nd=1; sb=1; d[1]=0; } if (x>0) { nd=0; sb=1; while (x>0) { nd++; d[nd]=x%10; x=x/10; } } if (x<0) { nd=0; sb=-1; x=-x; while (x>0) { nd++; d[nd]=x%10; x=x/10; } } } bignum(const bignum &x) { nd=x.nd; sb=x.sb; int i; for (i=1;i<=nd;i=i+1) d[i]=x.d[i]; } void input(void) { char s[MAX]; scanf("%s",s); sb=1; nd=0; int i; for (i=strlen(s)-1;i>=0;i=i-1) { nd++; d[nd]=s[i]-48; } } void print(void) { if (sb<0) printf("-"); int i; for (i=nd;i>=1;i=i-1) printf("%d",d[i]); } bignum abs() { bignum r=bignum(*this); r.sb=1; return (r); } int cmp(const bignum&x) { if (sb>x.sb) return (1); if (sb<x.sb) return (-1); if (nd>x.nd) return (sb); if (nd<x.nd) return (-sb); int i; for (i=nd;i>=1;i=i-1) { if (d[i]>x.d[i]) return (sb); if (d[i]<x.d[i]) return (-sb); } return (0); } bignum operator + (const bignum &x) // only compatible for non-negative integer { int n=max(nd,x.nd); int i,s,c; bignum res (*this); res=bignum(); res.sb=1;; s=0;c=0; for (i=nd+1;i<=n;i=i+1) d[i]=0; //for (i=x.nd+1;i<=n;i=i+1) x.d[i]=0; for (i=1;i<=n;i=i+1) { s=d[i]+x.d[i]+c; if (s>9) c=1; else c=0; res.nd++; res.d[res.nd]=s%10; } if (c>0) { res.nd++; res.d[res.nd]=1; } return (res); } bignum operator - (const bignum &x) // only compatible for non-negative integer { int tmp=cmp(x); if (tmp>0) { bignum res; res=bignum(); res.sb=1; int i,s,c; //for (i=x.nd+1;i<=nd;i=i+1) x.d[i]=0; s=0; c=0; for (i=1;i<=nd;i=i+1) { s=d[i]-x.d[i]-c; if (s<0) { s=s+10; c=1; } else c=0; res.nd++; res.d[res.nd]=s%10; } while (res.d[res.nd]==0) res.nd--; return (res); } if (tmp==0) return (bignum(0)); if (tmp<0) { bignum res; res=bignum(); int i,s,c; res.sb=-1; s=0;c=0; for (i=nd+1;i<=x.nd;i=i+1) d[i]=0; for (i=1;i<=x.nd;i=i+1) { s=x.d[i]-d[i]-c; if (s<0) { s=s+10; c=1; } else c=0; res.nd++; res.d[res.nd]=s%10; } while (res.d[res.nd]==0) res.nd--; return (res); } } bignum operator * (const bignum &x) //compatible for all numbers { if ((nd==1) && (d[1]==0)) return (bignum(0)); if ((x.nd==1) && (x.d[1]==0)) return (bignum(0)); bignum res; res=bignum(); res.sb=sb*x.sb; int i,j,s,c; for (i=1;i<=x.nd;i=i+1) { bignum tmp=bignum(); for (j=1;j<i;j=j+1) { tmp.nd++; tmp.d[tmp.nd]=0; } s=0;c=0; for (j=1;j<=nd;j=j+1) { s=d[j]*x.d[i]+c; c=s/10; tmp.nd++; tmp.d[tmp.nd]=s%10; } while (c>0) { tmp.nd++; tmp.d[tmp.nd]=c%10; c=c/10; } res=res+tmp; } return (res); } }; bignum a,b,c; int main(void) { a.input(); b.input(); c=a+b; c.print(); printf("\n"); c=a-b; c.print(); printf("\n"); c=a*b; c.print(); printf("\n"); }
Code mẫu của khuc_tuan
import java.math.BigInteger; import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); BigInteger a = new BigInteger(sc.next()); BigInteger b = new BigInteger(sc.next()); System.out.println(a.add(b)); System.out.println(a.subtract(b)); System.out.println(a.multiply(b)); } }
Comments