一个大数运算类

 

复制代码
#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;
}
复制代码

 

 

posted on   Phinecos(洞庭散人)  阅读(2755)  评论(1编辑  收藏  举报

编辑推荐:
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具

导航

统计

点击右上角即可分享
微信分享提示