求助高精度
  • 板块学术版
  • 楼主封禁用户
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/7/22 17:26
  • 上次更新2024/7/22 18:53:15
查看原帖
求助高精度
1028403
封禁用户楼主2024/7/22 17:26

rt,减法在答案是负数的情况会出错,除法没输出(,,,

QwQ

#include <iostream>
#include <cstring>
using namespace std;

const int N = 1e4 + 5;

struct BigInt
{
	int len, x[N];
	BigInt()
	{
		memset(x, 0, sizeof x);
		len = 0;
	}
	BigInt(string s)
	{
		memset(x, 0, sizeof x);
		len = s.size();
		for (int i = 0; i < len; i++)
		{
			x[i + 1] = s[len - i - 1] - '0';
		}
	}
};

ostream& operator << (ostream& os, BigInt s) // 输出
{
	for (int i = s.len; i >= 1; i--)
	{
		os << s.x[i];
	}
	return os;
}

istream& operator >> (istream& is, BigInt& p) // 输入
{
	string s;
	cin >> s;
	p = BigInt(s);
 	return is;
}

BigInt fix(BigInt p) // fix
{
	for (int i = 1; i < p.len; i++)
	{
		p.x[i + 1] += p.x[i] / 10;
		p.x[i] %= 10;
		if (p.x[i] < 0)
		{
			p.x[i] += 10;
			p.x[i + 1]--;
		}
	}
	while (p.x[p.len] > 9)
	{
		p.x[p.len + 1] += p.x[p.len] / 10;
		p.x[p.len] %= 10;
		p.len++;
	}
	while (p.x[p.len] == 0 && p.len > 1)
	{
		p.len--;
	}
	return p;
}

BigInt operator + (BigInt p, int m) // 大 加 小
{
	p.x[1] += m;
	return fix(p);
}

BigInt operator - (BigInt p, int m) // 大 减 小
{
	p.x[1] -= m;
	return fix(p);
}

BigInt operator * (BigInt p, int m) // 大 乘 小
{
	for (int i = 1; i <= p.len; i++)
	{
		p.x[i] *= m;
	}
	return fix(p);
}

BigInt operator / (BigInt p, int m) // 大 除 小
{
	int x = 0;
	BigInt c;
	c.len = p.len;
	for (int i = c.len; i > 0; i--)
	{
		c.x[i] = (x * 10 + p.x[i]) / m;
		x = (x * 10 + p.x[i]) % m;
	}
	return fix(c);
}

bool operator < (BigInt p, BigInt q) // 大 小于 大
{
	if (p.len < q.len) return true;
	if (p.len > q.len) return false;
	for (int i = p.len; i > 0; i--)
	{
		if (p.x[i] < q.x[i]) return true;
		if (p.x[i] > q.x[i]) return false;
	}
	return false;
}

bool operator == (BigInt p, BigInt q) // 大 等于 大
{
	if (p.len != q.len) return false;
	for (int i = p.len; i > 0; i--)
	{
		if (p.x[i] != q.x[i]) return false;
	}
	return true;
}

BigInt operator + (BigInt p, BigInt q) // 大 加 大
{
	BigInt c;
	c.len = max(p.len, q.len);
	for (int i = 1; i <= c.len; i++)
	{
		c.x[i] = p.x[i] + q.x[i];
	}
	return fix(c);
}

BigInt operator - (BigInt p, BigInt q) // 大 减 大
{
	for (int i = 1; i <= p.len; i++)
	{
		p.x[i] -= q.x[i];
	}
	return fix(p);
}

BigInt operator * (BigInt p, BigInt q) // 大 乘 大
{
	BigInt c;
	c.len = p.len + q.len;
	for (int i = 1; i <= p.len; i++)
	{
		for (int j = 1; j <= q.len; j++)
		{
			c.x[i + j - 1] += p.x[i] * q.x[j];
		}
	}
	if (c.x[c.len] == 0) c.len--;
	return fix(c);
}

BigInt operator / (BigInt p, BigInt q) // 大 除 大
{
	BigInt c;
	int s = 0;
	while (p.len > q.len)
	{
		q = q * 10;
		s++;
	}
	while (s >= 0)
	{
		c = c * 10;
		while (q < p || q == p)
		{
			c = c + 1;
			p = p - q;
		}
		q = q / 10;
		s--;
	}
	return fix(c);
}

BigInt operator % (BigInt p, int m) // 大 模 小
{
	BigInt c = p / m;
	p = p - c * m;
	return fix(p);
}

int main()
{
	string s1, s2;
	cin >> s1 >> s2;
	BigInt a(s1), b(s2);
	// cout << a + b << "\n";
    // cout << a - b << "\n"; 有错
    // cout << a * b << "\n";
    // cout << a / b << "\n"; 有错
	return 0;
}
2024/7/22 17:26
加载中...