Pages

4. Phép toán với số nguyên lớn


Viết chương trình thực hiện cộng, trừ, nhân, tìm thương nguyên (div) của hai số nguyên không âm lớn và tìm số dư của phép chia hai số nguyên lớn.
Input. Nhập từ tệp KTHC_04.INP gồm 2 dòng:  Dòng đầu là số nguyên a, dòng thứ hai là số nguyên b. Hạn chế a và b có không quá 500 chữ số.
Output. Kết quả xuất ra tệp KTHC_04.OUT gồm 4 dòng: Dòng thứ nhất là tổng a+b, dòng thứ hai là hiệu a-b, dòng thứ ba là tích a*b, dòng thứ tư là thương nguyên của phép chia số a cho số b, dòng thứ năm là dư của phép chia số a cho số b
Ví dụ.
KTHC_04.INP
KTHC_04.OUT
42
8
50
34
5
2

BÀI 4. CÁC PHÉP TOÁN VỚI SỐ NGUYÊN LỚN
#include <iostream>
#include “fstream”
#include <string>
#include <iomanip>
using namespace std;
ifstream fi;
ofstream fo;
string A, B;
long count_;
int lS;
void read_input(){
fi.open(“KTHC_04.INP”);
getline(fi, A);
getline(fi, B);
}
string add(string X, string Y) {
string Z=””;
int lx=X.length();
int ly=Y.length();
int l = (lx>ly)?lx:ly;
int carry=0;
int x, y, sum;
while (X.length() < l) X = ‘0’ + X;
while (Y.length() < l) Y = ‘0’ + Y;
for (int i= l-1; i>=0; i–) {
x = (int) X[i] – 48;
y = (int) Y[i] – 48;
sum = x + y + carry;
carry = sum/10;
Z = (char) (sum%10 + 48) + Z;
}
if (carry>0) Z = ‘1’ + Z;
return Z;
}
string sub (string X, string Y) {
string Z=””;
int lx=X.length();
int ly=Y.length();
int l = (lx>ly)?lx:ly;
int borrow=0;
int x, y, sum;
while (X.length() < l) X = ‘0’ + X;
while (Y.length() < l) Y = ‘0’ + Y;
for (int i= l-1; i>=0; i–) {
x = (int) X[i] ;
y = (int) Y[i] ;
sum = x – y – borrow;
if (sum <0) {
sum += 10;
borrow = 1;
} else
borrow = 0;
Z = (char) (sum%10 + 48) + Z;
}
while ((Z.length()>1) && (Z[0]==’0′)) Z.erase(0, 1);
return Z;
}
string multiply_1(string X, long b){
long carry=0, s, lx = X.length();
string Z=””;
for (int i= lx-1; i>=0; i–){
s = ((int) X[i] – 48 ) * b + carry;
carry = s / 10;
Z = (char) (s%10+48) + Z;
}
while (carry) {
Z= (char)(carry%10 + 48) + Z;
carry /= 10;
}
return Z;
}
string multiply(string X, string Y) {
long m, lx = X.length(), ly = Y.length() ;
string Z=””, tmp=””;
m = -1;
for (int i=lx-1; i>=0; i–){
m++;
tmp = multiply_1(Y, (int) X[i] – 48);
for (int j=0; j<m; j++) tmp = tmp + “0”;
Z = add(tmp, Z);
}
return Z;
}
string div_1(string X, long b){
int s=0, hold=0, lx=X.length();
string Z=””;
for (long i=0; i<lx; i++){
hold = hold*10 + (int)(X[i]) -48;
s    = hold/b;
hold %= b;
Z = Z + (char) (s + 48);
}
while ((Z.length()>1) && (Z[0]==’0′)) Z.erase(0,1);
return Z;
}
long mod_1(string X, long b) {
int hold=0, lx=X.length();
for (long i=0; i<lx; i++)
hold = ((int) X[i] -48 + hold * 10 ) % b;
return hold;
}
int cmp(string X, string Y){
int l, lx=X.length(), ly=Y.length();
l = (lx>ly)?lx:ly;
while (X.length() < l) X = ‘0’ + X;
while (Y.length() < l) Y = ‘0’ + Y;
if (X==Y) return 0;
if (X>Y) return 1;
return -1;
}
string div(string X, string Y) {
string tmp=Y, s=””, hold=””;
string kY[11]; int k=1; kY[0]=”0″;
for (long i=1; i<=10; i++) kY[i] = add(kY[i-1], Y);
for (long i=0; i<X.length(); i++) {
hold = hold + X[i];
k= 1;
while (cmp(hold, kY[k]) != -1) k++;
s = s + (char) (k-1+48);
hold = sub(hold, kY[k-1]);
}
while ((s.length()>1) && (s[0]==’0′)) s.erase(0,1);
return s;
}
/* string mod(string X, string Y) {
string tmp = multiply(Y,div(X,Y));
tmp = sub(X, tmp);
return tmp;
} */
string mod (string X, string Y) {
string hold=””;
string kY[11]; int k=1; kY[0]=”0″;
for (long i=1; i<=10; i++) kY[i] = add(kY[i-1], Y);
for (long i=0; i<X.length(); i++) {
hold = hold + X[i];
k= 1;
while (cmp(hold, kY[k]) != -1) k++;
hold = sub(hold, kY[k-1]);
}
return hold;
}
int main() {
read_input();
fo.open(“KTHC_04.OUT”);
fo << A << ‘\n’;
fo << B << ‘\n’;
fo << add(A,B) << ‘\n’;
if (cmp(A,B)!=-1) fo << sub(A,B) << ‘\n’;
fo << multiply(A,B) << ‘\n’;
fo << div(A,B) << ‘\n’;
fo << mod(A,B) << ‘\n’;
fo.close();
return 0;
}