大数加法、大数减法和大数乘法,模拟竖式计算方式:
加法:
#include<iostream>
#include<string>
using namespace std;
string x, y;
int la, lb, lc, a[1000005], b[1000005], c[1000005];
int max(int i ,int j) {
return (i > j) ? i : j;
}
int main() {
cin >> x >> y;
la = x.length();
lb = y.length();
lc = max(la, lb); //两个数相加位数取最大的,或者最大的加一
for(int i = 0 ; i < la ; i++) { //将字符串逆序保存到数组中
a[la - i] = x[i] - '0'; //因为我们算竖式加法是从后往前算的
}
for(int i = 0 ; i < lb ; i++) {
b[lb - i] = y[i] - '0';
}
for(int i = 1 ; i <= lc ; ++i) {
c[i] += a[i] + b[i]; //两个位数相加
c[i + 1] = c[i] / 10; //进位
c[i] %= 10; //进位完成之后它自己剩余的
}
if(c[lc+1] > 0) lc++; //如果发现最后一位大于0,说明两个数相加之后,总位数为最大长度再加一
for(int i = lc ; i > 0 ; --i) { //因为我们之前有过逆序操作,所以再逆序输出就得到结果了
cout << c[i];
}
return 0;
}
减法:
#include<iostream>
#include<string>
using namespace std;
string x, y;
int la, lb, a[100005], b[100005], c[100005];
int main() {
cin >> x >> y;
la = x.length();
lb = y.length();
if(la < lb || la == lb && x < y) { //将小数减大数转换成大数减小数,加上负号
swap(x, y);
swap(la, lb);
cout <<'-';
}
for(int i = 0 ; i < la ; ++i) {
a[la - i] = x[i] - '0';
}
for(int i = 0 ; i < lb ; ++i) {
b[lb - i] = y[i] -'0';
}
for(int i = 1; i <= la ; ++i) {
if(a[i] < b[i]) { //小数减大数,借位
a[i] += 10;
a[i + 1]--;
}
c[i] = a[i] - b[i];
}
while(c[la] == 0 && la > 1) la--; //如果前面有0,去除,但是最少要保留一个0
for(int i = la ; i > 0 ; --i) {
cout << c[i]; //逆序输出
}
return 0;
}
乘法:
#include<iostream>
#include<string>
using namespace std;
string x, y;
int la, lb, lc, a[100005], b[100005], c[100005];
int main() {
cin >> x >> y;
la = x.length();
lb = y.length();
for(int i = 0 ; i < la ; ++i) {
a[la - i] = x[i] - '0';
}
for(int i = 0 ; i < lb ; ++i) {
b[lb - i] = y[i] - '0';
}
for(int i = 1 ; i <= la ; ++i) {
for(int j = 1 ; j <= lb ; ++j) {
c[i + j - 1] += a[i] * b[j]; //乘法操作
c[i + j] += c[i + j - 1] / 10; //进位,和加法操作一样
c[i + j - 1] %= 10;
}
}
lc = la + lb; //两个数相乘,最终的位数可能是俩乘数的位数和,也有可能是位数和减一
while(c[lc] == 0 && lc > 1) lc--; //如果前面有0,还是像减法那样消去
for(int i = lc ; i > 0 ; --i) {
cout << c[i];
}
return 0;
}
如果觉得代码理解起来有点困难,带数值进去模拟。
Comments NOTHING