#include<iostream>
#include<string>
#include<cstring>/
#include<cstdlib>/
using namespace std;
struct bign{
int n[100];
int len=0;
//初始化
bign(){
memset(n, 0, sizeof(n));//cstdlib库
len = 0;
}
};
//赋值函数
bign fuzhi(string aa){
bign a;
a.len = aa.length();
for (int i = 0; i < a.len; i++){
a.n[i] = aa[a.len - i - 1]-'0';
}
return a;
}
//比较 a>b 1; a=b 0; a<b -1;
int cmp(bign a, bign b){
if (a.len>b.len) return 1;
else if (a.len < b.len) return -1;
else{
for (int i = a.len-1; i >= 0; i--){
if (a.n[i] > b.n[i]) return 1;
else if (a.n[i] < b.n[i]) return -1;
}
return 0;
}
}
//加法
bign add(bign a, bign b){
bign c;
int r = 0;//进位
int t = 0;
for (int i = 0; i < a.len || i < b.len; i++){
t = a.n[i] + b.n[i] + r;
if (t >= 10){
r = t / 10;
t = t % 10;
}
else{
r = 0;
}
c.n[c.len++] = t;
}
if (r != 0){
c.n[c.len++] = r;
}
return c;
}
//减法
bign sub(bign a, bign b){
bign c;
for (int i = 0; i < a.len || i < b.len; i++){
if (a.n[i] < b.n[i]){//如果减不过,借1
a.n[i] += 10; //这一位+10
a.n[i + 1]--; //前一位-1
}
c.n[c.len++] = a.n[i] - b.n[i];
}
while (c.n[c.len - 1] == 0){//去掉高位的0,比如8876-8875=0001
c.len--;
}
return c;
}
int main(){
bign a, b, c;
string aa, bb;
while (cin >> aa >> bb){//aa=10086 bb=29
a = fuzhi(aa);//a.n=68001 a.len=5
b = fuzhi(bb);//b.n=92 b.len=2
//加
c = add(a, b);
for (int i = c.len-1; i >= 0; i--){//得逆序输出,因为赋值函数把输入逆序了
cout << c.n[i];
}
cout << endl;
//减
if (cmp(a, b) == 0) cout << 0; //a=b
else{
if (cmp(a, b) == 1) c = sub(a, b); //a>b
if (cmp(a, b) == -1){ //a<b
c = sub(b, a);
cout << "-";
}
for (int i = c.len - 1; i >= 0; i--){//得逆序输出,因为赋值函数把输入逆序了
cout << c.n[i];
}
}
}
}
算法笔记5.6习题_大整数运算
最新推荐文章于 2020-05-09 14:05:27 发布