蒟蒻代码求调
查看原帖
蒟蒻代码求调
1393306
FengYueLang楼主2024/7/29 09:33

之前写了一份常规代码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

2024/7/29 09:33
加载中...