Re: how to add two no. of 100 digits or more?



On 5月30日, 下午3时53分, Umesh <fraternitydispo...@xxxxxxxxx> wrote:
Is there any way by which i can do it? Thanks.

#include<iostream>
#include<string>
#include<iomanip>
#include<algorithm>
using namespace std;

#define MAXN 9999
#define DLEN 4

class BigNum
{
private:
int a[500];//可以控制大数的位数
int len; //大数长度
public:
BigNum(){len = 1;memset(a,0,sizeof(a));}
BigNum(const int);
BigNum(const char*);
BigNum(const BigNum &);
BigNum &operator=(const BigNum &);
BigNum operator+(const BigNum &) const;
BigNum operator-(const BigNum &) const;
BigNum operator*(const BigNum &) const;
BigNum operator/(const int &) const;
BigNum operator^(const int &) const;
int operator%(const int &) const;
bool operator>(const BigNum & T)const;
void print();
};

BigNum::BigNum(const int b)
{
int c,d = b;
len = 0;
memset(a,0,sizeof(a));
while(d > MAXN)
{
c = d - (d / (MAXN + 1)) * (MAXN + 1);
d = d / (MAXN + 1);
a[len++] = c;
}
a[len++] = d;
}

BigNum::BigNum(const char*s)
{
int t,k,index,l;
memset(a,0,sizeof(a));
l = strlen(s);
len = l / DLEN;
if(l % DLEN)len++;
index = 0;
for(int i = l-1; i >= 0; i -= DLEN)
{
t = 0; k = i - DLEN + 1;
if(k < 0) k = 0;
for(int j = k; j <= i; j++)
t = t * 10 + s[j] - '0';
a[index++] = t;
}
}
BigNum::BigNum(const BigNum & T) : len(T.len)
{
int i;
memset(a,0,sizeof(a));
for(i = 0; i < len; i++)a[i] = T.a[i];
}
BigNum & BigNum::operator=(const BigNum & n)
{
len = n.len;
memset(a,0,sizeof(a));
for(int i = 0; i < len; i++)
a[i] = n.a[i];
return *this;
}
BigNum BigNum::operator+(const BigNum & T) const
{
BigNum t(*this);
int i,big;//位数
big = T.len > len ? T.len : len;
for(i = 0; i < big; i++)
{
t.a[i] +=T.a[i];
if(t.a[i] > MAXN)
{
t.a[i+1]++;
t.a[i] -= MAXN+1;
}
}
if(t.a[big] != 0)
t.len = big + 1;
else
t.len = big;
return t;
}
BigNum BigNum::operator-(const BigNum & T) const
{
int i,j,big;
bool flag;
BigNum t1,t2;
if(*this>T)
{
t1 = *this;
t2 = T;
flag = 0;
}
else
{
t1 = T;
t2 = *this;
flag = 1;
}
big = t1.len;
for(i = 0; i < big; i++)
{
if(t1.a[i] < t2.a[i])
{
j = i + 1;
while(t1.a[j] == 0) j++;
t1.a[j--]--;
while(j > i) t1.a[j--] += MAXN;
t1.a[i] += MAXN + 1 - t2.a[i];
}
else
t1.a[i] -= t2.a[i];
}
t1.len = big;
while(t1.a[len - 1] == 0 && t1.len > 1)
{
t1.len--;
big--;
}
if(flag)
t1.a[big-1] = 0 - t1.a[big-1];
return t1;
}
BigNum BigNum::operator*(const BigNum & T) const
{
BigNum ret;
int i,j,up;
int temp,temp1;
for(i = 0 ; i < len ; i++)
{
up = 0;
for(j = 0 ; j < T.len ; j++)
{
temp = a[i] * T.a[j] + ret.a[i+j] + up;
if(temp > MAXN)
{
temp1 = temp - temp / (MAXN + 1) * (MAXN + 1);
up = temp / (MAXN + 1);
ret.a[i + j] = temp1;
}
else
{
up = 0;
ret.a[i + j] = temp;
}
}
if(up != 0)
ret.a[i + j] = up;
}
ret.len = i + j;
while(ret.a[ret.len - 1] == 0 && ret.len > 1) ret.len--;
return ret;
}
BigNum BigNum::operator/(const int & b) const
{
BigNum ret;
int i,down = 0;
for(i = len-1; i >= 0; i--)
{
ret.a[i] = (a[i] + down * (MAXN + 1)) / b;
down = a[i] + down * (MAXN + 1) - ret.a[i] * b;
}
ret.len = len;
while(ret.a[ret.len - 1] == 0 && ret.len > 1) ret.len--;
return ret;
}
int BigNum::operator %(const int & b) const
{
int i,d = 0;
for (i = len-1; i >= 0; i--)
{
d = ((d * (MAXN+1)) % b + a[i]) % b;
}
return d;
}
BigNum BigNum::operator^(const int & n) const
{
BigNum t,ret(1);
if(n < 0) exit(-1);
if(n == 0) return 1;
if(n == 1) return *this;
int m = n;
while(m > 1)
{
t = *this;
for(int i=1;i<<1<=m;i<<=1)
t=t*t;
m -= i;
ret = ret*t;
if(m == 1)ret = ret * (*this);
}
return ret;
}
bool BigNum::operator>(const BigNum & T) const
{
int ln;
if(len > T.len)
return true;
else if(len == T.len)
{
ln = len - 1;
while(a[ln] == T.a[ln] && ln >= 0) ln--;
if(ln >= 0 && a[ln] > T.a[ln])
return true;
else
return false;
}
else
return false;
}
void BigNum::print()
{
int i;
cout << a[len-1];
for(i = len-2; i >= 0; i--)
{
cout.width(DLEN);
cout.fill('0');
cout << a[i];
}
cout << endl;
}

.



Relevant Pages

  • problem with port pdumpfs
    ... unchanged /data/intebignum too big to convert into `int' ... bignum too big to convert into `int' ... Anyway I know nothing about Ruby - what should i be looking for in the ...
    (freebsd-questions)
  • Re: use bigmnum?
    ... use bignum; ... as int appears to be overloaded. ... But if $div == NaN, ... I don't imagine upgrading myself to 5.8.8 overnight. ...
    (comp.lang.perl.modules)
  • Re: Long number base conversion
    ... What I am trying to do is to write a simple bignum library, ... numbers which are basically Array Encoded Integers. ... but I dont have that code anymore and want to ... and bignum / int -> ...
    (comp.lang.c)
  • Re: use bigmnum?
    ... gamo wrote: ... use bignum; ... as int appears to be overloaded. ... But if $div == NaN, ...
    (comp.lang.perl.modules)
  • [patch 6/6] fs: d_hash change for rcu-walk
    ... typedef int; ... static int affs_compare_dentry(const struct dentry *parent, ... const struct dentry *dentry, const struct inode *inode, ...
    (Linux-Kernel)