问:为什么报错?
做一个高精度算法的类,有三个文件:
- main.cpp
- HANum.h
- HANum.cpp
完整代码如下(错误在HANum.cpp第61行):
HANum.h
#pragma once
#include <iostream>
#include <deque>
#include <string>
class HANum {
public:
HANum();
HANum(std::string);
~HANum();
HANum operator=(unsigned int);
HANum operator+(HANum);
HANum operator-(HANum);
//HANum operator*(HANum);//提交时注:注释因为还没实现,下同(包括HANum.cpp)
//HANum operator/(HANum);
//HANum operator>(HANum);
std::string toString();
static HANum fromString(std::string);
private:
//下标从低到高对应数位从高到低
std::deque<unsigned int> num;
//小数点在deque第几个元素前
unsigned int dot;
bool pos;
void cleanZeros();
};
std::istream &operator>>(std::istream &, HANum &);
std::ostream &operator<<(std::ostream &, HANum);
HANum.cpp
#include "HANum.h"
using namespace std;
typedef unsigned int UINT;
HANum::HANum() { pos = false; dot = 0; }
HANum::HANum(string s) {
pos = false;
dot = 0;
*this = HANum::fromString(s);
}
HANum::~HANum() {}
HANum HANum::operator=(UINT x) {
while (x) {
num.push_back(x % 10);
x /= 10;
}
return *this;
}
HANum HANum::operator+(HANum x) {
HANum self = *this;
//加负数
/* if (!x.pos) {
x.pos = true;
return self - x;
}
if (!pos) {
self.pos = true;
return x - self;
}
*/
//对齐小数点
while (self.dot > x.dot) {
self.dot--;
self.num.push_back(0);
}
while (self.dot < x.dot) {
x.dot--;
x.num.push_back(0);
}
deque<UINT> v[2] = { num, x.num };
deque<UINT> r;
deque<UINT> *shorter, *longer;
if (v[0].size() > v[1].size()) {
longer = &v[0];
shorter = &v[1];
}
else {
longer = &v[1];
shorter = &v[0];
}
r.push_front(0);
for (int i = longer->size(); i >= shorter->size() + 1; i--) {
UINT t = v[0][i - 1] + v[1][i - 1] + r[0];
r.push_front(t / 10);
r[1] = t - r[0];
}
for (UINT i = longer->size() - shorter->size(); i > 0; i--) {
UINT t = (*longer)[i - 1] + r[0];
r.push_front(t / 10);
r[1] = t - r[0];
}
UINT t = (*longer)[0] + r[0];
r.push_front(t / 10);
r[1] += t - r[0];
HANum n;
n.num = r;
n.dot = x.dot;
n.cleanZeros();
return n;
}
/*
HANum HANum::operator-(HANum x) {
if (!x.pos) {
x.pos = true;
return *this + x;
}
if (!pos) {
HANum t = *this;
t.pos = true;
return x - t;
}
deque<UINT> v[2] = { num, x.num };
deque<UINT> r;
UINT shorter, longer;
if (v[0].size() > v[1].size()) {
longer = 0;
shorter = 1;
}
else {
longer = 1;
shorter = 0;
}
r.push_back(0);
for (int i = 0; i < v[shorter].size(); i++) {
UINT t = v[0][i] + v[1][i] + r[i];
r.push_back(t / 10);
r[i] = t - r[i + 1];
}
for (UINT i = v[shorter].size(); i < v[longer].size(); i++) {
UINT t = v[longer][i] + r[i];
r.push_back(t / 10);
r[i] = t - r[i + 1];
}
HANum n;
n.num = r;
return n;
}
*/
string HANum::toString() {
string r;
deque<UINT> t = num;
UINT d = dot;
bool isInt = !dot;
while (!t.empty()) {
if (!isInt && d == 1) {
r += '.';
t.pop_front();
}
r += t.front() + '0';
t.pop_front();
d--;
}
return r;
}
HANum HANum::fromString(string s) {
HANum r;
UINT d = 0;
for (auto i : s) {
d++;
if (i == '.') r.dot = d;
else r.num.push_front(i - '0');
}
return r;
}
void HANum::cleanZeros() {
while (num.size() > 1) {
if (num.front() == '0') num.pop_front();
else break;
}
while (num.size() > 1 && dot > 0) {
if (num.back() == '0') {
num.pop_back();
dot--;
}
else break;
}
}
//**************************************************
istream &operator>>(istream& is, HANum &n) {
string t;
is >> t;
n = HANum::fromString(t);
return is;
}
ostream &operator<<(ostream &os, HANum n) {
string t = n.toString();
os << t;
return os;
}
main.cpp
#include "HANum.h"
using namespace std;
int main() {
HANum x, y;
cin >> x >> y;
cout << x + y;
}