对于一个新手 ,我们的首题一般都是 。
但是我们要严格要求自己,应该采用高级一点的算法去解决同类问题。
高精度就是一个深化版基本运算的例子。
// Author:PanDaoxi
#include <bits/stdc++.h>
#define endl "\n"
using namespace std;
const int INF = 101; // 支持 (INF-1) 位的运算
struct bn{ // 大数结构体
string s, absn; // s: 输入的数 absn: 绝对值
int num[INF], len, absLen; // num: 逆序存储 len: 输入的数的长度 absLen: 绝对值的长度
bool neg; // neg: 负数标记
void inp(){
cin >> s;
len = s.size();
neg = (s[0] == '-'); // 获取负数标记
absn = neg ? s.substr(neg) : s; // 截取绝对值
absLen = absn.size(); // 获取绝对值长度
for(int i=0; i<absLen; i++){ // 只记录绝对值的逆序,和符号无关
num[i] = absn[absLen-i-1] - '0';
}
return;
}
} a, b; // 输入的两个数
int c[INF+1]; // 结果
char cABS(){ // 字符串长度比较(字典序)
if(a.absLen > b.absLen || (a.absLen >= b.absLen && a.absn > b.absn)){
return 'a';
}
else if(a.absn == b.absn){
return '=';
}
else{
return 'b';
}
}
void add(){ // 加法函数 (a+b)
for(int i=0; i<max(a.len, b.len)+1; i++){
c[i] += a.num[i] + b.num[i];
c[i+1] += c[i] / 10;
c[i] %= 10;
}
return;
}
void sub(){ // 减法函数 (a-b)
for(int i=0; i<max(a.len, b.len)+1; i++){
if(a.num[i] < b.num[i]) c[i+1]--;
c[i] += 10 - b.num[i] + a.num[i];
c[i] %= 10;
}
return;
}
void work(){
if(!a.neg && !b.neg){ // 同号(正)
add();
}
else if(a.neg && b.neg){ // 同号(负)
cout << "-";
add();
}
else{ // 异号
char c = cABS();
if(c == '='){ // a=b,a-b=0
cout << 0;
return;
}
if(a.neg && !b.neg){ // a负b正
if(c == 'a'){ // a的绝对值大于b的绝对值
cout << "-";
sub();
}
else{ // a的绝对值小于b的绝对值
swap(a, b);
sub();
}
}
else{ // a正b负
if(c == 'a'){ // a的绝对值大于b的绝对值
sub();
}
else{ // a的绝对值小于b的绝对值
cout << "-";
swap(a, b);
sub();
}
}
}
int point = 0; // 高精度的输出
for(int i=max(a.len, b.len) + 1; i>=0; i--){
if(c[i]){
point = i;
break;
}
}
for(int i=point; i>=0; i--){
cout << c[i];
}
return;
}
int main(){
ios :: sync_with_stdio(false);
a.inp();
b.inp();
work();
return 0;
}