我成功地替你们 为自己 解决了高精度过难的问题
#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"); // 暂停运行, 可以删除.
}
同样的, 有问题可以私信反馈.