danni505
主版主
帖子
1490
精华
7
无忧币 8610
积分 6767
阅读权限 150
来自 (保密)
|
发表于:2006-8-26 00:45
标题:一个十进制大数运算类,支持加减乘除模、n次乘方、n次开方等运算
<上一帖 |
下一帖>
花了点时间写了这么个东西,目前只支持正整数的运算。
还有很多重要的功能,如素性的检测等还没有完成。
增加了负数 --20060823
decnum.h
#include
#include
#include
using namespace std;
class decnum
{
friend decnum pow(const decnum& x, int n);
friend decnum root(const decnum& x, int n);
friend decnum div(const decnum& x, const decnum& y, decnum& r);
friend decnum abs(const decnum& x);
friend bool operator==(const decnum& x, const decnum&y);
friend bool operator!=(const decnum& x, const decnum&y);
friend bool operator>(const decnum& x, const decnum&y);
friend bool operator=(const decnum& x, const decnum&y);
friend bool operator= '0' && v[n-1-i]
decnum.cpp
#include "decnum.h"
decnum&
decnum::absadd(const decnum& x)
{
int i, max;
char carry = 0, ch;
if(x.num == 0) return *this;
if(num cap)
{
cap = max;
char *newval = new char[cap];
memcpy(newval, val, num);
memset(newval+num, 0, cap - num);
delete[] val;
val = newval;
}
else
{
memset(val+num, 0, max - num);
}
num = max-1;
for(i=0; i 9) {
carry = 1;
val = ch - 10;
}
else {
carry = 0;
val = ch;
}
}
for(; i 9) {
carry = 1;
val = ch - 10;
}
else {
carry = 0;
val = ch;
}
}
if(i>num) num = i;
return *this;
}
decnum&
decnum::abssub(const decnum& x)
{
if(x.num == 0) return *this;
int i;
char carry = 0, ch;
for(i=0; i0 && val[i-1] == 0; i--);
num = i;
return *this;
}
bool
decnum::absge(const decnum& x)
{
if(num > x.num) return true;
if(num = 0; i--)
if(val > x.val)
return true;
else if(val b.num - 1)
i = n - b.num + 1;
else
i=0;
max = n 0 || carry > 0; mul /= 10, i++) {
ch = ptr + mul % 10 + carry;
if(ch > 9) {
carry = 1;
ptr = ch - 10;
}
else
{
carry = 0;
ptr = ch;
}
}
}
for(i=a.num + b.num; i>0 && ptr[i-1] == 0; i--);
num = i + na + nb;
if(cap >= num) {
memcpy(val, newval, num);
delete[] newval;
}
else {
cap = newcap;
delete[] val;
val = newval;
}
a.val = b.val = NULL;
return *this;
}
decnum&
decnum: perator/=(const decnum& x)
{
char ch, carry, fac;
decnum tmp;
int i;
if(x.num == 0) return *this;
if(num = x.num-1; i--) {
tmp.val--;
tmp.num++;
ch = (carry * 10 + val) / fac;
tmp -= x * ch;
while(tmp >= x) {
tmp -= x;
ch++;
}
newval[i-x.num+1] = ch;
carry = val;
}
tmp.val = NULL;
for(i=num-x.num+1; i>0 && newval[i-1] == 0; i--);
num = i;
delete[] val;
val = newval;
return *this;
}
decnum&
decnum: perator%=(const decnum& x)
{
char ch, carry, fac;
decnum tmp;
int i;
if(x.num == 0) return *this;
if(num = x.num-1; i--) {
tmp.val--;
tmp.num++;
ch = (carry * 10 + val) / fac;
tmp -= x * ch;
while(tmp >= x) {
tmp -= x;
ch++;
}
carry = val;
}
tmp.val = NULL;
num = tmp.num;
return *this;
}
decnum
decnum: perator+(const decnum& x) const
{
decnum tmp = *this;
return tmp += x;
}
decnum
decnum::operator-(const decnum& x) const
{
decnum tmp = *this;
return tmp -= x;
}
decnum
decnum::operator*(const decnum& x) const
{
decnum tmp = *this;
return tmp *= x;
}
decnum
decnum::operator/(const decnum& x) const
{
decnum tmp = *this;
return tmp /= x;
}
decnum
decnum::operator%(const decnum& x) const
{
decnum tmp = *this;
return tmp %= x;
}
decnum abs(const decnum& x)
{
decnum tmp(x);
tmp.sign = 0;
return tmp;
}
decnum pow(const decnum& x, int n)
{
decnum tmp(1), fac(x);
for(; n>0; n>>=1) {
if(n&0x01)
tmp *= fac;
fac *= fac;
}
return tmp;
}
char decnum::root_1(int n)
{
char r = (int)(pow(1+val[num-1], 1.0/n) * pow(10,(num-1.0)/n));
for(; r>0 && pow(decnum(r), n) > *this; r--);
return r;
}
bool decnum::ispow(int n, decnum& r) const
{
if(num == 0) {
r.num = 0;
return true;
}
if(sign == 1 && (n&1 == 0)) {
r.num = 0;
return false;
}
decnum tmp, p;
r.cap = r.num = (num+n-1) / n;
r.val = new char[r.num];
r.sign = sign;
memset(r.val, 0, r.num);
tmp.val = val + (r.num-1)*n;
tmp.num = num - (r.num-1)*n;
r.val[r.num-1] = tmp.root_1(n);
tmp.val = new char[r.num+1];
tmp.cap = r.num+1;
int v;
p = pow(r, n);
if(p == *this) return true;
for(int i=r.num-2; i>=0; i--) {
memset(tmp.val, 0, i+1);
tmp.val = 1;
tmp.num = i+1;
tmp += r;
p = (*this - p) / (pow(tmp, n) - p);
if(p.num > 1)
v = 9;
else if(p.num > 0)
v = p.val[0];
else
v = 0;
for(; v>=0; v--) {
r.val = v;
p = pow(r, n);
if(p == *this)
return true;
if(p dec2; n+=2) {
if(ispow(n, r)) return true;
}
return false;
}
decnum
root(const decnum& x, int n)
{
decnum r;
x.ispow(n, r);
return r;
}
decnum
div(const decnum& x, const decnum& y, decnum& r)
{
char ch, carry, fac;
decnum d = x, tmp;
int i;
if(y.num == 0) return x;
if(d.num = y.num-1; i--) {
tmp.val--;
tmp.num++;
ch = (carry * 10 + d.val) / fac;
tmp -= y * ch;
while(tmp >= y) {
tmp -= y;
ch++;
}
newval[i-y.num+1] = ch;
carry = d.val;
}
r = tmp;
tmp.val = NULL;
for(i=d.num-y.num+1; i>0 && newval[i-1] == 0; i--);
d.num = i;
delete[] d.val;
d.val = newval;
return d;
}
bool operator==(const decnum& x, const decnum&y)
{
if(x.sign != y.sign) return false;
if(x.num != y.num) return false;
for(int i=0; i (const decnum& x, const decnum&y)
{
if(x.sign > y.sign) return false;
if(x.sign y.num) return retval;
if(x.num = 0; i--)
if(x.val > y.val)
return retval;
else if(x.val x;
}
bool operator>=(const decnum& x, const decnum&y)
{
if(x.sign > y.sign) return false;
if(x.sign y.num) return retval;
if(x.num = 0; i--)
if(x.val > y.val)
return retval;
else if(x.val = x;
}
ostream& operator=0; i--)
os
|
 『 天道酬勤 』 君子之行,静以修身,俭以养德。非淡泊无以明志,非宁静无以致远。
|
|