本文最后更新于 1861 天前,其中的信息可能已经有所发展或是发生改变。
本文持续更新中~敬请关注
#include<bits/stdc++.h>
using namespace std;
const int MAXN = 14000;
struct BigInt
{
bool flag;
int len;
int number[MAXN];
BigInt(BigInt& a)
{
flag = a.flag;
len = a.len;
memcpy(number, a.number, MAXN * 4);
}
BigInt()//新建高精度数
{
memset(number, 0, MAXN * 4);
flag = 1;
}
BigInt(string s)//字符串类型输入,双精度
{
memset(number, 0, MAXN * 4);
flag = 1;
if (s[0] == '-')
{
flag = 0;
s.erase(s.begin());
}
int dec[] = { 1,10,100,1000 };
reverse(s.begin(), s.end());
len = s.size();
for (int i = 0; i < len; i++)
{
number[i / 4] += (s[i] - '0') * dec[i % 4];
}
}
BigInt(int num)
{
memset(number, 0, MAXN * 4);//构造函数初始化数组
flag = 1;
if (num < 0)
{
flag = 0;
num = abs(num);
}
len = 1;//0
int dec[] = { 1,10,100,1000 };
for (int i = 0; num > 0; i++)
{
number[i / 4] += (num % 10) * dec[i % 4];
num /= 10;
len = i + 1;
}
}
int operator[](int i)//从个位数右往左起,从0计数,不可赋值
{
int dec[] = { 1,10,100,1000 };
int ans = number[i / 4] / dec[i % 4] % 10;
return ans;
}
void print()//打印数字
{
if (flag == 0)cout << "-";
cout << number[(len - 1) / 4];
for (int i = (len - 1) / 4 - 1; i >= 0; i--)
{
cout << setfill('0') << setw(4) << number[i];
}
}
void edit(int i, int j)//把第i位修改为j
{
int dec[] = { 1,10,100,1000 };
number[i / 4] = number[i / 4] - ((*this)[i] - j) * dec[i % 4];
}
};
BigInt operator-(BigInt a, BigInt b);
int compare_abs(BigInt& a, BigInt& b)
{
for (int i = (a.len - 1) / 4; i >= 0; i--)
{
if (a.number[i] < b.number[i])return 1;
if (a.number[i] > b.number[i])return 0;
}
return 2;
}
int compare(BigInt& a, BigInt& b)
{
if (a.flag == 0 && b.flag == 1)return true;
if (a.flag == 1 && b.flag == 0)return false;
if (a.flag == 1)
{
if (a.len < b.len)return true;
if (a.len > b.len)return false;
int temp = compare_abs(a, b);
if (temp == 1)return 1;
if (temp == 0)return 0;
return 2;
}
else
{
if (a.len < b.len)return false;
if (a.len > b.len)return true;
int temp = compare_abs(a, b);
if (temp == 1)return 0;
if (temp == 0)return 1;
return 2;
}
}
bool operator<(BigInt& a, BigInt& b)
{
if (compare(a, b) == 1)return true;
else return false;
}
bool operator>(BigInt& a, BigInt& b)
{
if (compare(a, b) == 0)return true;
else return false;
}
bool operator==(BigInt& a, BigInt& b)
{
if (compare(a, b) == 2)return true;
else return false;
}
BigInt operator*(BigInt a, BigInt b)
{
BigInt ans;
if (a.flag != b.flag)ans.flag = 0;
ans.len = a.len + b.len;
for (int i = 0; i <= (a.len - 1) / 4; i++)//可减少运算量
{
for (int j = 0; j <= (b.len - 1) / 4; j++)
{
ans.number[i + j] += a.number[i] * b.number[j];
ans.number[i + j + 1] += ans.number[i + j] / 10000;
ans.number[i + j] %= 10000;
}
}
if (ans[ans.len - 1] == 0)ans.len--;
if (ans[ans.len - 1] == 0)ans.len = 1;//结果为0时
return ans;
}
BigInt operator+(BigInt a, BigInt b)
{
if (a.flag == 1 && b.flag == 0)
{
b.flag = !b.flag;
a = a - b;
return a;
}
else if (a.flag == 0 && b.flag == 1)
{
a.flag = !a.flag;
a = b - a;
return a;
}
BigInt ans;
if (a.flag == 0 && b.flag == 0)ans.flag = 0;
ans.len = max(a.len, b.len);
for (int i = 0; i <= (ans.len - 1) / 4; i++)
{
ans.number[i] += a.number[i] + b.number[i];
ans.number[i + 1] += ans.number[i] / 10000;
ans.number[i] %= 10000;
}
if (ans[ans.len])ans.len++;
return ans;
}
BigInt operator-(BigInt a, BigInt b)
{
if (a.flag == 1 && b.flag == 0)
{
b.flag = !b.flag;
a = a + b;
return a;
}
else if (a.flag == 0 && b.flag == 1)
{
a.flag = !a.flag;
BigInt temp;
temp = a + b;
temp.flag = 0;
return temp;
}
else if (a.flag == 0 && b.flag == 0)
{
a.flag = !a.flag;
b.flag = !b.flag;
BigInt temp;
temp = a + b;
temp.flag = 0;
return temp;
}
BigInt ans;
ans.len = max(a.len, b.len);
for (int i = 0; i <= (ans.len - 1) / 4; i++)
{
ans.number[i] += a.number[i] - b.number[i];
if (ans.number[i] < 0)
{
ans.number[i] += 10000;
ans.number[i + 1]--;
}
}
int i = (ans.len - 1) / 4;
if (ans.number[i + 1] < 0)//负数处理
{
ans.flag = 0;
for (int j = 0; j <= i; j++)
{
ans.number[j] = 10000 - ans.number[j];
ans.number[j + 1]++;
}
}
while (i >= 0 && ans.number[i] == 0)i--;
ans.len = (i + 1) * 4;
while (ans.len > 0 && ans[ans.len - 1] == 0)ans.len--;
return ans;
}
BigInt operator^(BigInt a, int b)
{
BigInt ans(1);
while (b)
{
if (b % 2 == 1)ans = ans * a;
if (b != 1)a = a * a;//可能溢出
b = b / 2;
}
return ans;
}
/*
高精度四则运算Release
1.MAXN控制高精度数位数,过小可能溢出。最大位数为MAXN*4
2.高精度数有三种创建方式,直接创建,字符串类型转换,int类型转换
3.一个高精度数结构体内必有三个成员:flag,数字长度,数字数组。新建高精度数必须给长度赋值
4.运算符重载,两个对象均为BigInt时,使用引用。其中一个为int时,转换成BigInt
5.ans.len为数字位数,[]下标访问时从第0位开始
*/
int main()
{
//Demo演示
string a, b;
cin >> a >> b;
BigInt aa(a), bb(b);
aa = aa * bb;
aa.print();
return 0;
}
更新日志:
V1.0
1.上线
V1.1
1.内存优化
2.修复了运算次数过多的Bug,性能提升
3.修复了溢出问题
V2.0
1.支持负数运算
TODO Lists: