# include <iostream>
# include <string>
using namespace std;
struct bign
{
int d[1000];
int len;
bign() : d{0}, len(0){} // // memset(d, 0, sizeof(d));
bign(string num): bign(){
this->len = num.size();
// 逆着赋值,方便在运算时从低位到高位运算i可以从0开始
for(int i=0;i<num.size();++i)
this->d[i] = num[this->len-1 - i] - '0';
}
void showArr() const{
for(int i=0;i<len;++i){
cout << d[i] << " ";
}cout << endl;
}
void show()const{
for(int i=len-1;i>=0;i--){
cout << d[i];
}cout << endl;
}
bool operator<(const bign & rhs){
if(this->len < rhs.len)
return true;
else
if(this->len > rhs.len)
return false;
else
for(int i = len-1; i >= 0 ; i--){
if(this->d[i] < rhs.d[i])
return true;
else
if(this->d[i] > rhs.d[i])
return false;
}
return false;
}
bool operator>(const bign & rhs){
if(this->len < rhs.len)
return false;
else
if(this->len > rhs.len)
return true;
else
for(int i = len-1; i >= 0 ; i--){
if(this->d[i] < rhs.d[i])
return false;
else
if(this->d[i] > rhs.d[i])
return true;
}
return false;
}
bool operator==(const bign & rhs){
if(this->len == rhs.len){
for(int i = len-1; i >= 0 ; i--){
if(this->d[i] != rhs.d[i])
return false;
}
}
else
return false;
return true;
}
bign operator+(const bign & rhs){
bign c;
int carry = 0;
// 以较长的数字为长度为界限,因为初始化没有数字的位置都为0,
// 所以在短的运算完后,对长的后面的部分也只是+0-0之类的也无影响
for(int i=0;i<this->len || i<rhs.len;++i){
int temp = this->d[i] + rhs.d[i] + carry; // 每一位和进位相加
c.d[c.len++] = temp % 10; // 对两数当前位相加的结果取余就是c当前位的结果
carry = temp / 10; // 对两数当前位相加的结取十位就是进位
}
// 如果最后得到的进位不为0,那么最高位就是进位
if(carry != 0)
c.d[c.len++] = carry;
return c;
}
bign operator-(const bign & rhs){
bign c;
// 以较长的数字为长度为界限,因为初始化没有数字的位置都为0,
// 所以在短的运算完后,对长的后面的部分也只是+0-0之类的也无影响
for(int i=0;i<this->len || i<rhs.len;++i){
if(this->d[i] < rhs.d[i]){ // 不过当前位不够减,就需要向高位借位
this->d[i+1]--; // 高位被借位
this->d[i] += 10; // 当前为将借到的位加上
}
c.d[c.len++] = this->d[i] - rhs.d[i]; // 两数当前位相减就是c当前位的结果
}
// 如果最后两个最高位相等相减后为0,就需要将这个0去掉,长度也要-1
// c.len > 1是为了防止两数相减等于0,导致len=0从而得到错误的结果(len至少为1)
while(c.len > 1 && c.d[c.len - 1] == 0)
c.len--;
return c;
}
bign operator*(int rhs){
bign c;
int carry = 0;
for(int i=0;i<this->len;++i){
int temp = this->d[i] * rhs + carry;
c.d[c.len++] = temp % 10;
carry = temp / 10;
/* 经试验,不用temp也可以
carry = this->d[i] * rhs + carry;
c.d[c.len++] = carry % 10;
carry /= 10;
*/
}
// 处理最后一个进位
while(carry != 0){
c.d[c.len++] = carry % 10;
carry /= 10;
}
return c;
}
pair<bign, int> operator/(int rhs){
bign c;
int r = 0; // 余数
c.len = this->len;
for(int i = this->len - 1; i >= 0 ;i--){ // 从高位开始
r = r*10 + this->d[i];
if(r < rhs) // 不够除,该位为0
c.d[i] = 0;
else{ // 够除
c.d[i] = r / rhs;
r = r % rhs;
}
}
// 去除0
while(c.len > 1 && c.d[c.len - 1] == 0)
c.len--;
return {c, r};
}
};
int main()
{
string strnum1, strnum2;
cin >> strnum1 >> strnum2;
bign a(strnum1), b(strnum2);
bign c;
c = a+b;
c.show();
cout << endl;
c = a-b;
c.show();
cout << endl;
c = a * 35;
c.show();
cout << endl;
auto cc = a / 7;
cc.first.show();
cout << cc.second;
return 0;
}
【C++版本】大整数bign的建立与运算
最新推荐文章于 2022-11-07 00:08:25 发布