一个大数运算类

↘锁芯ラ 提交于 2020-01-25 00:59:10

 

#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;
}

 

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!