最近发现了一个特别神奇的代码,可以轻松的进行C++高精度运算:
namespace Bigint
{
class bigint
{
private:
int value[10005];
short leng;
bool fuhao;
bigint plus(bigint a);
friend bigint minus(bigint a, bigint b);
bigint cheng(int a);
public:
bigint(int n);
bigint();
int length() { return leng; }
friend std::ostream& operator << (std::ostream& output, bigint c);
friend std::istream& operator >> (std::istream&, bigint&);
friend bigint operator+(bigint a, bigint b);
friend bigint operator+(bigint a, int b);
friend bigint operator+(int a, bigint b);
friend bigint operator-(bigint a, bigint b);
friend bigint operator-(bigint a, int b);
friend bigint operator-(int a, bigint b);
friend bool operator>(bigint a, bigint b);
friend bool operator>(bigint a, int b);
friend bool operator>(int a, bigint b);
friend bool operator<(bigint a, bigint b);
friend bool operator<(bigint a, int b);
friend bool operator<(int a, bigint b);
friend bool operator==(bigint a, bigint b);
friend bool operator==(bigint a, int b);
friend bool operator==(int a, bigint b);
friend bool operator>=(bigint a, bigint b);
friend bool operator>=(bigint a, int b);
friend bool operator>=(int a, bigint b);
friend bool operator<=(bigint a, bigint b);
friend bool operator<=(bigint a, int b);
friend bool operator<=(int a, bigint b);
friend bool operator!=(bigint a, bigint b);
friend bool operator!=(bigint a, int b);
friend bool operator!=(int a, bigint b);
friend bigint operator<<(bigint a,int b);
friend bigint operator>>(bigint a, int b);
friend bigint operator*(bigint a, bigint b);
friend bigint operator*(bigint a, int b);
friend bigint operator*(int a, bigint b);
friend bigint operator/(bigint a, bigint b);
friend bigint operator/(bigint a, int b);
friend bigint operator/(int a, bigint b);
friend bigint operator%(bigint a, bigint b);
friend bigint operator%(bigint a, int b);
friend bigint operator%(int a, bigint b);
friend bigint operator+=(bigint &a, bigint b);
friend bigint operator+=(bigint &a, int b);
friend int operator+=(int &a, bigint b);
friend bigint operator-=(bigint &a, bigint b);
friend bigint operator-=(bigint &a, int b);
friend int operator-=(int &a, bigint b);
friend bigint operator<<=(bigint&a, int b);
friend bigint operator>>=(bigint&a, int b);
friend bigint operator*=(bigint &a, bigint b);
friend bigint operator*=(bigint &a, int b);
friend bigint operator*=(int &a, bigint b);
friend bigint operator/=(bigint &a, bigint b);
friend bigint operator/=(bigint &a, int b);
friend bigint operator/=(int &a, bigint b);
friend bigint operator%=(bigint &a, bigint b);
friend bigint operator%=(bigint &a, int b);
friend bigint operator%=(int &a, bigint b);
bigint operator++();
bigint operator++(int);
bigint operator--();
bigint operator--(int);
bool operator!();//气势磅礴的运算符重载
operator int();
// operator long long();
// operator short();
};
bigint::bigint(int n)
{
for (int i = 0; i < 10005; i++)value[i] = 0;
if (n >= 0)fuhao = true;
else fuhao = false;
n = n >= 0 ? n : -n;
for (leng = 1; n; leng++, n /= 10)value[leng] = n % 10;
leng--;
}
bigint::bigint()
{
for (int i = 0; i < 10005; i++)
value[i] = 0;
leng = 0;
fuhao = true;
}
//输出
std::ostream& operator << (std::ostream& output, bigint c)
{
if (c.leng == 0)
{
std::cout << 0;
return output;
}
if (c.fuhao == false)output << '-';
for (int i = c.leng; i > 0; i--)output << c.value[i];
return output;
}
//输入
std::istream& operator >> (std::istream& input, bigint& c)
{
std::string s;
input >> s;
int i = s.length(), j = 0;
c.leng = s.length();
if (s[j] == '-')
{
j++;
c.fuhao = false;
c.leng--;
i--;
}
else c.fuhao = true;
for (; i > 0; i--, j++)c.value[i] = s[j] - '0';
return input;
}
//大于
bool operator>(bigint a, bigint b)
{
if (a.fuhao != b.fuhao)return a.fuhao;
if (a.leng != b.leng)return (a.leng < b.leng) xor (a.fuhao);
for (int i = a.leng; i > 0; i--)
if (a.value[i] != b.value[i])
return (a.value[i] < b.value[i]) xor a.fuhao;
return false;
}
/*
高精大于低精
(不要说多余,加个构造函数就行了,
这个程序既有低精转高精的构造函数,
又有高精转低精的类型转换函数,
编译器会报错有歧义,不知道是转换成高精比高精还是低精比低精,
但是有了类型完全匹配的函数,
编译器才不会想着转换类型,才会直接调用这个函数。)
*/
bool operator>(bigint a, int b)
{
return a > bigint(b);
}
bool operator>(int a, bigint b)
{
return bigint(a) > b;
}
//小于
bool operator<(bigint a, bigint b)
{
if (a.fuhao != b.fuhao)return b.fuhao;
if (a.leng != b.leng)return (a.leng > b.leng) xor (a.fuhao);
for (int i = a.leng; i > 0; i--)
if (a.value[i] != b.value[i])
return (a.value[i] > b.value[i]) xor a.fuhao;
return false;
}
bool operator<(bigint a, int b)
{
return a < bigint(b);
}
bool operator<(int a, bigint b)
{
return bigint(a) < b;
}
//高精加高精(符号一样)
//或高精减高精(符号不一样)
bigint bigint::plus(bigint a)
{
bigint b;
int max;
if (leng > a.leng)max = leng;
else max = a.leng;
for (int i = 1; i <= max; i++)
{
b.value[i] += value[i] + a.value[i];
b.value[i + 1] = b.value[i] / 10;
b.value[i] %= 10;
}
if (b.value[max + 1] == 0)b.leng = max;
else b.leng = max + 1;
b.fuhao = fuhao;
return b;
}
//高精加高精(符号不一样)
//或高精减高精(符号一样)
bigint minus(bigint a, bigint b)
{
bigint c;
c.fuhao = a.fuhao;
a.fuhao = 1;
b.fuhao = 1;
if (a < b)
{
bigint d = a;
a = b;
b = d;
c.fuhao ^= 1;
}
for (int i = 1; i <= a.leng; i++)
{
c.value[i] += a.value[i] - b.value[i];
if (c.value[i] < 0)
{
c.value[i + 1]--;
c.value[i] += 10;
}
}
for (int i = a.leng; i > 0; i--)
{
if (c.value[i] != 0)
{
c.leng = i;
return c;
}
}
c.leng = 0;
c.fuhao = true;
return c;
}
//加
bigint operator+(bigint a, bigint b)
{
bigint c;
if (!a.fuhao^b.fuhao)
{
c.fuhao = a.fuhao;
c = a.plus(b);
}
else
{
b.fuhao ^= 1;
c = minus(a, b);
}
return c;
}
bigint operator+(bigint a, int b)
{
return a + bigint(b);
}
bigint operator+(int a, bigint b)
{
return bigint(a) + b;
}
//减
bigint operator-(bigint a, bigint b)
{
bigint c(0);
if (!a.fuhao^b.fuhao)
{
c.fuhao = a.fuhao;
c = minus(a, b);
}
else
{
b.fuhao ^= 1;
c = a.plus(b);
}
return c;
}
bigint operator-(bigint a, int b)
{
return a - bigint(b);
}
bigint operator-(int a, bigint b)
{
return bigint(a) - b;
}
//等于
bool operator==(bigint a, bigint b)
{
if (a.fuhao != b.fuhao)return false;
if (a.leng != b.leng)return false;
for (int i = 1; i <= a.leng; i++)if (a.value[i] != b.value[i])return false;
return true;
}
bool operator==(bigint a, int b)
{
return a == bigint(b);
}
bool operator==(int a, bigint b)
{
return bigint(a) == b;
}
//大于等于
bool operator>=(bigint a, bigint b)
{
return !(a < b);
}
bool operator>=(bigint a, int b)
{
return !(a < bigint(b));
}
bool operator>=(int a, bigint b)
{
return !(bigint(a) < b);
}
//小于等于
bool operator<=(bigint a, bigint b)
{
return !(a > b);
}
bool operator<=(bigint a, int b)
{
return !(a > bigint(b));
}
bool operator<=(int a, bigint b)
{
return !(bigint(a) > b);
}
//自增(前置)
bigint bigint::operator++()
{
*this = *this + 1;
return *this;
}
//自增(后置)
bigint bigint::operator++(int)
{
bigint a = *this;
*this = *this + 1;
return a;
}
//自减(前置)
bigint bigint::operator--()
{
*this = *this - 1;
return *this;
}
//自减(后置)
bigint bigint::operator--(int)
{
bigint a = *this;
*this = *this - 1;
return a;
}
//高精转换成低精
//(在不溢出的情况下
//位数尽可能多)
bigint::operator int()
{
int a = 0;
for (int i = 9; i > 0; i--)
{
a *= 10;
a += value[i];
}
int b = 0;
for (int i = 10; i > 0; i--)
{
b *= 10;
b += value[i];
}
int c;
if (b < 0)c = a;
else c = b;
if (fuhao)return c;
else return -c;
}
bool operator!=(bigint a, bigint b)
{
return !(a == b);
}
bool operator!=(bigint a, int b)
{
return !(a == bigint(b));
}
bool operator!=(int a, bigint b)
{
return !(bigint(a) == b);
}
//高精乘一位数(正数)
bigint bigint::cheng(int a)
{
bigint b;
for (int i = 1; i <= leng; i++)b.value[i] = value[i] * a;
for (int i = 1; i <= leng; i++)if (b.value[i] > 9)
{
b.value[i + 1] += b.value[i] / 10;
b.value[i] %= 10;
}
b.fuhao = true;
for (int i = leng + 1; i > 0; i--)
{
if (b.value[i])
{
b.leng = i;
return b;
}
}
b.leng = 0;
return b;
}
bigint operator<<(bigint a, int b)
{
for (int i = a.leng + b; i > b; i--)a.value[i] = a.value[i - b];
for (int i = b; i > 0; i--)a.value[i] = 0;
a.leng += b;
return a;
}
bigint operator>>(bigint a, int b)
{
for (int i = 1; i <= a.leng - b; i++)a.value[i] = a.value[i + b];
for (int i = a.leng - b + 1; i <= a.leng; i++)a.value[i] = 0;
a.leng -= b;
if (a.leng < 0)a.leng = 0;
return a;
}
//高精乘
bigint operator*(bigint a, bigint b)
{
if (a == 0 || b == 0)return bigint(0);
bigint c;
for (int i = 1; i <= b.leng; i++)
{
bigint d = a.cheng(b.value[i])<<(i-1);
c += d;
}
c.fuhao = !(a.fuhao^b.fuhao);
for(int i=a.leng+b.leng;i>0;i--)
if (c.value[i] != 0)
{
c.leng = i;
break;
}
return c;
}
bigint operator*(bigint a, int b)
{
return bigint(b)*a;
}
bigint operator*(int a, bigint b)
{
return bigint(a)*b;
}
bigint operator/(bigint a, bigint b);
bigint operator/(bigint a, int b);
bigint operator/(int a, bigint b);
bigint operator%(bigint a, bigint b);
bigint operator%(bigint a, int b);
bigint operator%(int a, bigint b);
bigint operator+=(bigint &a, bigint b)
{
a = a + b;
return a;
}
bigint operator+=(bigint &a, int b)
{
a = a + bigint(b);
return a;
}
int operator+=(int &a, bigint b)
{
a = int(bigint(a) + b);
return a;
}
bigint operator-=(bigint &a, bigint b)
{
a = a + b;
return a;
}
bigint operator-=(bigint &a, int b)
{
a = a + bigint(b);
return a;
}
int operator-=(int &a, bigint b)
{
a = int(bigint(a) + b);
return a;
}
bigint operator<<=(bigint&a, int b)
{
a = a << b;
return a;
}
bigint operator>>=(bigint&a, int b)
{
a = a >> b;
return a;
}
bigint operator*=(bigint &a, bigint b)
{
a = a * b;
return a;
}
bigint operator*=(bigint &a, int b)
{
a = a * b;
return a;
}
bigint operator*=(int &a, bigint b)
{
a = int(a*b);
return a;
}
bigint operator/=(bigint &a, bigint b);
bigint operator/=(bigint &a, int b);
bigint operator/=(int &a, bigint b);
bigint operator%=(bigint &a, bigint b);
bigint operator%=(bigint &a, int b);
bigint operator%=(int &a, bigint b);
bool bigint::operator!()
{
return *this == bigint(0);
}
}
这个代码重载了所有运算符,还定义了一种新的数据类型:bigint
使用方法1:
#include <bits/stdc++.h> // 导入万能头
// 在这里粘贴之前的一长串代码
using namespace std;
using namespace Bigint;
bigint a,b; // 定义高精度变量
signed main(){
ios::sync_with_stdio(false);// 解除cin、cout绑定,减少时间复杂度
cin.tie(0); //使用cin输入时不刷新缓冲区
cin >> a >> b;
cout << a + b;
return 0;
}
使用方法2:
首先将之前的一长串代码粘贴到Bigint.h文件中,随后将其放在和代码相同目录中
#include <bits/stdc++.h> // 导入万能头
#include "Bigint.h" // 导入高精度头文件
using namespace std;
using namespace Bigint;
bigint a,b; // 定义高精度变量
signed main(){
ios::sync_with_stdio(false);// 解除cin、cout绑定,减少时间复杂度
cin.tie(0); //使用cin输入时不刷新缓冲区
cin >> a >> b;
cout << a + b;
return 0;
}
就是这么简单~~~