您的位置:首页 > 编程语言 > C语言/C++

参考小白书上用c++采用结构体重载的大数类模版

2016-06-02 20:53 423 查看
未完待续,等我学会快速傅里叶再来写除法,知道除法也就会写取余了。浮点数就拉倒了,或许我会来写写负数。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;

const int maxn = 1000;

struct bign
{
int len, s[maxn];

bign()
{
memset(s, 0, sizeof(s));
len = 1;
}

bign& clean()
{
while (len > 1 && !s[len - 1])
len--;
return
*this;
}

bign operator = (const char* num)
{
len = strlen(num);
for(int i=0; i<len; i++)
{
s[i] = num[len-i-1] - '0';
}
return *this;
}

bign operator = (int num)
{
char s[maxn];
sprintf(s, "%d", num);
*this = s;
return *this;
}

bign(int num)
{
*this = num;
}

bign(const char* num)
{
*this = num;
}

string str() const
{
string res = "";
for(int i = 0; i < len; i++)
{
res = (char)(s[i] + '0') + res;
}
if(res == "")
{
res = "0";
}
return res;
}

bign operator + (const bign& b) const
{
bign c;
c.len = 0;
for(int i = 0, g = 0; g || i < max(len, b.len); i++)
{
int x = g;

if(i < len)
{
x += s[i];
}

if(i < b.len)
{
x += b.s[i];
}

c.s[c.len++] = x % 10;
g = x / 10;
}
return c;
}

bign operator * (const bign &b)const
{
bign c;
int i,j,ans,temp;
c.len = 0;
memset(c.s, 0, sizeof(c.s));
for(i = 0; i < len; i++)
{
for(j = 0, temp = 0; j < b.len; j++)
{
temp = s[i] * b.s[j];
c.s[i + j] += temp;
}
}
for(i = 0, ans = 0; i < len + b.len - 1; i++)
{
c.s[i + 1] += c.s[i] / 10;
c.s[i] %= 10;
}
c.len = len + b.len;
return c.clean();
}

bign operator - (const bign &b) const
{
bign c,d = b;
c.len = 0;
for(int i = 0; i < len; i++)
{
int t = s[i] - d.s[i];
if(t >= 0)
c.s[c.len++] = t;
else
{
d.s[i+1] = d.s[i+1] - 1;
c.s[c.len++] = s[i] + 10 - d.s[i];
}
}
return c;
}

bool operator == (const bign &b)const
{
if(len != b.len)
return false;
for(int i = 0; i < len; i++)
{
if(s[i] != b.s[i])
return false;
}
return true;
}

bool operator != (const bign &b)const
{
if(len != b.len)
return true;
for(int i = 0; i < len; i++)
{
if(s[i] != b.s[i])
return true;
}
return false;
}

bool operator > (const bign &b)const
{
if(len > b.len)
return true;
else if(len < b.len)
return false;
for(int t = len; t >= 0; t--)
{
if(s[t] > b.s[t])
return true;
}
return false;
}
};

istream& operator >> (istream &in, bign &x)
{
string s;
in >> s;
x = s.c_str();
return in;
}

ostream& operator << (ostream &out, const bign &x)
{
out << x.str();
return out;
}

int main(void)
{
bign a, b, result;
while((cin >> a >> b))
{
result = a * b;
cout << result << endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: