一个大数运算类

简介:
#include <stdio.h>
#include <math.h>
#include <iostream>

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>=(const decnum& x, const decnum&y);
    friend bool operator<=(const decnum& x, const decnum&y);
    friend ostream& operator<<(ostream&os, const decnum& x);

public:
    decnum() : cap(0), num(0), sign(0), val(NULL) { }
    decnum(const char *v, int n)
    {
        int i, j,k;
        val = new char[n];
        if(v[0] == '-') 
        {
            sign = 1;
            v++;
            n--;
        }
        else
        {
            sign = 0;
            if(v[0] == '+')
                v++;
        }
        for(i = 0; i < n && v[i] == '0'; i++);
        for (j=0,k=n-1;k>=i;--k,++j)
        {
            if (v[k]>='0' && v[k]<='9')
            {
                val[j] = v[k]-'0';
            }
            else
                break;
        }
        num = j;
        cap = n;
    }
    decnum(const decnum& x) 
    {
        val = new char[x.num];
        memcpy(val, x.val, x.num);
        sign = x.sign;
        num = x.num;
        cap = x.num;
    }
    decnum(int x)
    {
        if(x==0)
        {
            cap = num = 0;
            val = NULL;
            return;
        }
        if(x < 0) 
        {
            sign = 1;
            x = -x;
        }
        else
            sign = 0;
        char temp[20];
        sprintf(temp, "%d", x);
        int n = strlen(temp);
        num = cap = n;
        val = new char[n];
        for(int i=0; i<n; i++)
            val[i] = temp[n-1-i] - '0';
    }
    decnum(long long x)
    {
        if(x==0)
        {
            cap = num = 0;
            val = NULL;
            return;
        }
        if(x < 0) 
        {
            sign = 1;
            x = -x;
        }
        else
            sign = 0;
        char temp[20];
        sprintf(temp, "%lld", x);
        int n = strlen(temp);
        num = cap = n;
        val = new char[n];
        for(int i=0; i<n; i++)
            val[i] = temp[n-1-i] - '0';
    }
    ~decnum() { delete[] val; }

    int size() const { return num; }

    decnum& operator=(const decnum& x)
    {
        if (this != &x) 
        {
            if(cap < x.num)
            {
                delete[] val;
                val = new char[x.num];
                cap = x.num;
            }
            memcpy(val, x.val, x.num);
            num = x.num;
            sign = x.sign;
        }
        return *this;
    }
    decnum& operator=(int x)
    {
        *this = decnum(x);
        return *this;
    }
    decnum& operator=(long long x)
    {
        *this = decnum(x);
        return *this;
    }
    decnum& abs()
    {
        sign = 0;
        return *this;
    }
    decnum& operator+=(const decnum& x);
    decnum& operator-=(const decnum& x);
    decnum& operator*=(const decnum& x);
    decnum& operator/=(const decnum& x);
    decnum& operator%=(const decnum& x);
    decnum  operator+(const decnum& x) const;
    decnum  operator-(const decnum& x) const;
    decnum  operator*(const decnum& x) const;
    decnum  operator/(const decnum& x) const;
    decnum  operator%(const decnum& x) const;

    bool ispow(int n, decnum& r) const;
    bool ispow() const;
private:
    int  cap;
    int  num;
    int  sign;
    char *val;
private:
    char root_1(int n);
    decnum& absadd(const decnum& x);
    decnum& abssub(const decnum& x);
    bool absge(const decnum& x);
};
复制代码
实现代码

大数类实现代码
 

测试代码:

复制代码
#include <iostream>
#include <string>
using namespace std;
#include "decnum.h"

int main()
{
    decnum x, y, r;
    string line;
    size_t  n = 0;
    cout << "input x:" << endl;
    getline(cin,line);
    x = decnum(line.c_str(), line.length());
    cout << "input y:" << endl;
    getline(cin,line);
    y = decnum(line.c_str(), line.length());
    cout << "x = " << x << endl;
    cout << "y = " << y << endl;
    cout << "x * y =" << x * y << endl;
    cout << "x / y =" << x / y << endl;
    cout << "x % y =" << x % y << endl;
    cout << "div(x, y) =" << div(x , y, r) << endl;
    cout << "mod(x, y) =" << r << endl;
    cout << "y ^ 2 =" << pow(y, 2) << endl;
    cout << "x ^ 1/2 =" << root(x, 2) << endl;
    cout << "x is pow = " << x.ispow() << endl;
    system("pause");
    return 0;
}
复制代码


本文转自Phinecos(洞庭散人)博客园博客,原文链接:http://www.cnblogs.com/phinecos/archive/2008/11/12/1332344.html,如需转载请自行联系原作者
目录
相关文章
|
6月前
|
C#
57.c#:directorylnfo类
57.c#:directorylnfo类
50 0
C++类的一些特殊知识
C++类的一些特殊知识
|
6月前
|
存储 程序员 数据安全/隐私保护
C++类
C++类
54 0
|
6月前
|
存储 Java
JAVAObject类
JAVAObject类
46 0
|
5月前
|
存储 安全 C#
C# 类的深入指南
C# 类的深入指南
|
6月前
|
C# 数据安全/隐私保护
56.c#:filelnfo类
56.c#:filelnfo类
55 2
|
6月前
|
API C# vr&ar
59.c#:steamWriter类
59.c#:steamWriter类
49 0
|
6月前
|
存储 API C#
60.c#:steamreader类
60.c#:steamreader类
59 0
TimeUnit类详解
TimeUnit类详解
296 0
TimeUnit类详解
下一篇
无影云桌面