之前写了一份常规代码AC了,试图写一个高精度的类,但#5过不了,本地测进位前缀零都没问题,求大佬讲解!!!Orz。
#include <bits/stdc++.h>
using namespace std;
const int SIZE = 1e4 + 5; //数组长度
const int Jinzhi = 10; //进制
class High
{
private:
short nums[SIZE] = {0}; //用于运算的数组
int len; //数组长度
string mstr; //方便输出的字符串,内容和数组相同
public:
High(string str); //构造函数
~High(); //当摆设的析构
High operator+(const High h2) const; //加法
void out(); //输出函数
};
High::High(const string str = "")//默认空字符串
{
mstr = str;
len = str.size();
for (int i = 1; i <= len; ++i)
{
char ch = str[i-1];
nums[i] = atoi(&ch);
}
//逐个输入数字,下标从1开始
}
High::~High()
{}
//摆设
High High::operator+(const High h2) const
{
High sum; //储存结果的临时对象
int lena = len, lenb = h2.len; //分别储存操作数1和2的长度
int lenmax = max(lena, lenb); //取长度最大值
sum.len = lenmax;
for (int i = lenmax; i > 0; --i)
{
sum.nums[i] += nums[i - (lenmax - lena)] + h2.nums[i - (lenmax - lenb)];
/*emm这步是我为了少些判断想出来的东西,效果是对齐最低位
原理:
str1:1234
str2:12345
此时lenmax = 5,sum从[5]开始,应当加上str2[5] 和 str1[4]
即str1比lenmax少了几位,相加时str1的下标向前移几位
反过来同理*/
if (sum.nums[i] >= Jinzhi)
{
sum.nums[i] %= Jinzhi; //进位
++sum.nums[i - 1];
}
}
int i;//临时变量,储存前缀零个数(虽然加法里最多一个,不过为了方便后面乘法就这么写了)
for (i = 0; sum.nums[i] == 0; ++i);
if (!i)//如果没有前缀零,则证明sum[0] 有数字,需要把sum整体右移
{
for (int ii = lenmax + 1; ii >= 0; --ii)
{
sum.nums[ii] = sum.nums[ii - 1];
}
sum.len += 1;//长度+1,因为sum[0]有一位
}
string t = "";//临时字符串,为了储存到成员字符串mstr
for (int i = 1; i <= sum.len; ++i)
{
t += to_string(sum.nums[i]);
}
sum.mstr = t;
return sum;//输出对象sum
}
void High::out()//输出函数
{
cout << mstr << endl;
}
int main()//主函数,读入并输出
{
string str1, str2;
cin >> str1 >> str2;
High h(str1);
High h1(str2);
h = h + h1;
h.out();
}
码风实在奇怪就恳求大佬谅解了Orz