高精度头文件完成

我成功地替你们 为自己 解决了高精度过难的问题

#pragma once

#ifndef _INTEGER_HPP_
#define _INTEGER_HPP_

#include <string>

class Integer
{
private:
	std::string value;

public:
	Integer(void) = default;

	Integer(const int& x)
	{
		value = std::to_string(x);
	}

	Integer(int&& x)
	{
		value = std::to_string(x);
		x = 0;
	}

	Integer(const Integer& x)
	{
		value = x.value;
	}

	Integer(Integer&& x) noexcept
	{
		if (&x != this)
		{
			value = x.value;
			x.value = "";
		}
	}

	Integer(const std::string& x)
	{
		value = x;
	}

	Integer(std::string&& x) noexcept
	{
		if (&x != &(this->value))
		{
			value = x;
			x = "";
		}
	}

	void operator=(const Integer& x)
	{
		value = x.value;
	}

	void operator=(Integer&& x) noexcept
	{
		if (&x != this)
		{
			value = x.value;
			x.value = "";
		}
	}

	const Integer operator+(const Integer& x) const
	{
		Integer all;
		all.value.resize(value.size() >= x.value.size() ? value.size() + 1 : x.value.size() + 1);

		int a = 0;
		bool more = false;
		while (a < (value.size() <= x.value.size() ? value.size() : x.value.size()))
		{
			all.value[all.value.size() - a - 1] = (value[value.size() - a - 1] - '0') + (x.value[x.value.size() - a - 1] - '0') + (int)more + '0';
			more = false;
			if (all.value[all.value.size() - a - 1] > '9')
			{
				all.value[all.value.size() - a - 1] -= 10;
				more = true;
			}
			a++;
		}

		while (a < value.size())
		{
			all.value[all.value.size() - a - 1] = (value[value.size() - a - 1] - '0') + (int)more + '0';
			more = false;
			if (all.value[all.value.size() - a - 1] > '9')
			{
				all.value[all.value.size() - a - 1] = all.value[all.value.size() - a - 1] - 10;
				more = true;
			}
			a++;
		}
		while (a < x.value.size())
		{
			all.value[all.value.size() - a - 1] = (x.value[x.value.size() - a - 1] - '0') + (int)more + '0';
			more = false;
			if (all.value[all.value.size() - a - 1] > '9')
			{
				all.value[all.value.size() - a - 1] = all.value[all.value.size() - a - 1] - 10;
				more = true;
			}
			a++;
		}

		if (more)
		{
			all.value[0] = '1';
		}
		else
		{
			all.value.erase(all.value.begin());
		}

		return all;
	}

	void operator+=(const Integer& x)
	{
		value = operator+(x).value;
	}

	const Integer operator-(const Integer& x) const
	{
		Integer all;
		all.value.resize(value.size());

		int a = 0;
		bool less = false;
		while (a < (value.size() <= x.value.size() ? value.size() : x.value.size()))
		{
			all.value[all.value.size() - a - 1] = (value[value.size() - a - 1] - '0') - (x.value[x.value.size() - a - 1] - '0') - (int)less + '0';
			less = false;
			if (all.value[all.value.size() - a - 1] < '0')
			{
				all.value[all.value.size() - a - 1] += 10;
				less = true;
			}
			a++;
		}

		while (a < value.size())
		{
			all.value[all.value.size() - a - 1] = (value[value.size() - a - 1] - '0') - (int)less + '0';
			less = false;
			if (all.value[all.value.size() - a - 1] < '0')
			{
				all.value[all.value.size() - a - 1] += 10;
				less = true;
			}
			a++;
		}

		while (all.value.size() > 1 && *all.value.begin() == '0')
		{
			all.value.erase(all.value.begin());
		}

		if (all.value.empty())
		{
			return (Integer)0;
		}
		else
		{
			return all;
		}
	}

	void operator-=(const Integer& x)
	{
		value = operator-(x).value;
	}

	const Integer operator*(const Integer& x) const
	{
		if (value == "0" || x.value == "0")
		{
			return (Integer)0;
		}

		Integer all;
		all.value.resize(value.size() + x.value.size(), '0');

		for (int a = value.size() - 1; a >= 0; a--)
		{
			int more = 0;
			for (int b = x.value.size() - 1; b >= 0; b--)
			{
				int total = (value[a] - '0') * (x.value[b] - '0') + (all.value[a + b + 1] - '0') + more;

				all.value[a + b + 1] = (total % 10) + '0';
				more = total / 10;
			}

			if (more)
			{
				all.value[a] = (more + '0');
			}
		}

		while (!all.value.empty() && *all.value.begin() == '0')
		{
			all.value.erase(all.value.begin());
		}

		if (all.value.empty())
		{
			return (Integer)0;
		}
		else
		{
			return all;
		}
	}

	void operator*=(const Integer& x)
	{
		value = operator*(x).value;
	}

	const Integer operator/(const Integer& x) const
	{
		Integer last = 0;
		std::string total = "";
		for (int a = 0; a < value.size(); a++)
		{
			last = last * (Integer)10 + (Integer)(value[a] - '0');

			int count = 0;
			while (x * (Integer)count <= last)
			{
				count++;
			}
			total += count - 1 + '0';
			last -= x * (Integer)(count - 1);
		}

		while (total.size() > 1 && *total.begin() == '0')
		{
			total.erase(total.begin());
		}

		return (Integer)total;
	}

	void operator/=(const Integer& x)
	{
		value = operator/(x).value;
	}

	const Integer operator%(const Integer& x)const
	{
		Integer last = 0;
		std::string total = "";
		for (int a = 0; a < value.size(); a++)
		{
			last = last * (Integer)10 + (Integer)(value[a] - '0');

			int count = 0;
			while (x * (Integer)count <= last)
			{
				count++;
			}
			total += count - 1 + '0';
			last -= x * (Integer)(count - 1);
		}

		while (total.size() > 1 && *total.begin() == '0')
		{
			total.erase(total.begin());
		}

		return last;
	}

	void operator%=(const Integer& x)
	{
		value = operator%(x).value;
	}

	bool operator<(const Integer& x) const
	{
		if (value.size() < x.value.size())
		{
			return true;
		}
		else if (value.size() > x.value.size())
		{
			return false;
		}
		else
		{
			return value < x.value;
		}
	}

	bool operator>(const Integer& x) const
	{
		if (value.size() > x.value.size())
		{
			return true;
		}
		else if (value.size() < x.value.size())
		{
			return false;
		}
		else
		{
			return value > x.value;
		}
	}

	bool operator<=(const Integer& x) const
	{
		if (value.size() < x.value.size())
		{
			return true;
		}
		else if (value.size() > x.value.size())
		{
			return false;
		}
		else
		{
			return value <= x.value;
		}
	}

	bool operator>=(const Integer& x) const
	{
		if (value.size() > x.value.size())
		{
			return true;
		}
		else if (value.size() < x.value.size())
		{
			return false;
		}
		else
		{
			return value >= x.value;
		}
	}

	bool operator==(const Integer& x) const
	{
		if (value.size() != x.value.size())
		{
			return false;
		}
		else
		{
			return value == x.value;
		}
	}

	bool operator!=(const Integer& x) const
	{
		if (value.size() != x.value.size())
		{
			return true;
		}
		else
		{
			return value != x.value;
		}
	}

	operator int(void) const
	{
		return std::stoi(value);
	}

	friend std::istream& operator>>(std::istream& stream, Integer& x)
	{
		stream >> x.value;
		return stream;
	}

	friend std::ostream& operator<<(std::ostream& stream, const Integer& x)
	{
		stream << x.value;
		return stream;
	}

	~Integer(void) = default;
};

#endif

有任何问题请反馈, 我会尽快修订 只要我看到了

修订1

很多人反馈不知道怎么使用, 在这里统一说明
使用方法:
使用类型 Integer 进行声明, 接着大部分运算就都可以使用.
示例: A+B Problem

#include <iostream>

#include "Integer.hpp" // 主体头文件, 包含了高精度类的定义.

int main()
{
	Integer x, y; // 使用 Integer 类型进行声明.
	std::cin >> x >> y; // 可以直接使用 std::cin, 重载过 operator>>(std::istream&, Integer).

	std::cout << x + y << std::endl; // 可以直接使用 std::cout, operator<<(std::ostream&, Integer), 和 operator+(const Integer).

	system("pause"); // 暂停运行, 可以删除.
}

同样的, 有问题可以私信反馈.

5 个赞

@jhxs411 能说一下,具体该怎么操作吗?

2 个赞

是这样用的对吧

#include<highprecision.h>//我把它封装到highprecision.h里面了
#include<bits/stdc++.h>
using namespace std;
int main(){
	string a,b;
	cin>>a>>b;
	cout<<a+b;
	return 0;
}

结果:


建议做一个函数类似add这样的,方便区分

1 个赞

不对

2 个赞

那要怎么用

2 个赞

是用Integer吗

3 个赞

神之1+1=11

1 个赞

image
@金杭东 有人回老帖

请不要会老帖,警告一次。
而且你不要水贴