文本版|topic 高级搜索
   名人堂 帮助 论坛制度 意见反馈 | 首页 博客 周新贴 招聘 专题 新闻
RSS 底部
 
社区导航: 专家门诊   网络技术   操作系统   数据库   程序设计   系统应用   考试认证   CIO及信息化   站长交流   综合交流   下载基地  51CTO产品服务 设为首页 | 收藏本站
51CTO技术论坛» C/C++ » 一个十进制大数运算类,支持加减乘除模、n次乘方、n次开方等运算       [ 打印]  [ 订阅]  [ 收藏]  [ 推荐给朋友]   [ 本帖文本页]

论坛跳转:
     
标题: 一个十进制大数运算类,支持加减乘除模、n次乘方、n次开方等运算  ( 查看:728  回复:0 )   
 
danni505
主版主  点击可查看详细


帖子 1490
精华 7
无忧币 8610
积分 6767
阅读权限 150
来自 (保密)
注册日期 2006-5-1
最后登录 2008-5-8 离线

[查看资料]  [发短消息]  [Blog
[个人主页]    QQ    ICQ 状态     
发表于: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




『 天道酬勤 』      君子之行,静以修身,俭以养德。非淡泊无以明志,非宁静无以致远。

2006-8-26 00:451楼
[ 顶部 ]
     
论坛跳转:  

| | |

标记已读 · 删除论坛Cookies · 文本版 · WAP
 
| 诚征版主 | 版主堂 | 意见建议 | 大史记 | 论坛地图
Copyright©2005-2008 51CTO.COM  Powered by Discuz!
本论坛言论纯属发布者个人意见,不代表51CTO网站立场!如有疑义,请与管理员联系。
京ICP备05051492号