cpp设计并实现大整数


前言

第三次发csdn,心情还是有些许的激动


一、设计大整数类

功能:简易设计类似python的大整数加法。

1.第一步:大整数类的输入和部分功能的构建

class HugeInteger
{
private:
    string integer;               //用string类型储存数值
public:

    HugeInteger();               //构造函数

    HugeInteger(int a);          //赋值
    HugeInteger(string a);

    HugeInteger operator+(HugeInteger a);  //重载"+"运算符,实现不同类型相加
    HugeInteger operator+(int);
    HugeInteger operator+(string);

    friend ostream& operator<<(ostream& os,HugeInteger);//重载输出运算符,实现连续输出
};

在实现相加或者后续拓展运算时,若使用程序内置的整数类型可能出现溢出错误等情况,而且不同类型的运算可能无法进行,从而我们就有需求将大整数类(后期可以扩展至整数域)作为标准,正整数计算均已大整数类进行。
*本文章主要实现大正整数的加法

2.第二步:用string类保存大整数数值

string integer;               //用string类型储存数值

string类的功能很完善,能够动态的分配空间,使得我们不用担心数值溢出等问题,提高效率;并且用string类可以通过字符串的拼接,解决加法进位问题(若宽展至负整数,不仅利于计算,而且输出可以通过拼接,非常简便)

3.第三步:关于大整数类的赋值

    HugeInteger(){                //默认为00,其中第一个0为占位符,从第二位开始为数值,输出时可以省略
        integer="00";
    };

    HugeInteger(int a){           //将int类型转化为HugeInteger类型
        string x;
        x=to_string(a);           //类型转换函数包含在头文件<string>
        integer="0"+x;
    } ;
    HugeInteger(string a){        //将string类型转化为HugeInteger类型
        integer="0"+a;
    };

因为数字相加会存在进位,在数字前面拼接 “0” 可以避免在后续运算中 首位相加 进一 后 超出字符串长度,从而系统报错。
*即实际储存值为“0XXX~~XX”
*并且实现了不同类型数值读取并赋值

4.第四步:大整数加法的实现及兼容性

    HugeInteger operator+(HugeInteger a){       //加法运算符(+)重载,实现HugeInteger类型相加
        HugeInteger INT,max0;
        max0=a;
        INT=*this;

        int Size,Size1,Size2,n=0;

        Size1=INT.integer.size();
        Size2=a.integer.size();

        if (INT.integer.size()>a.integer.size())
        {
            n=1;
            max0=INT;
        };
        if (n==0) Size=Size1;
        else Size=Size2;
        for (int i=0;i<Size;i++)
        {
            int x=0,y=0,z=0;
            x=INT.integer[Size1-i]-'0';     //将那一位对应的字符转换成字符所代表的数字
            y=a.integer[Size2-i]-'0';
            z=x+y;
            x=z%10;
            y=z/10;
            INT.integer[Size1-i]=x+'0';    //将数字转化成字符,再替代此位置字符
            int j=i;
            while(y==1){               //实现加1后连续进位
                if (INT.integer[Size1-j-1]=='9') INT.integer[Size1-j-1] ='0';
                else{
                    INT.integer[Size1-j-1]+=y;
                    y=0;
                }
                j++;
            }
        };

        return INT;
    };
    HugeInteger operator+(int a){     //加法运算符(+)重载,实现HugeInteger类型与int类型相加

        HugeInteger INT(a);           //将int类型转化成HugeInteger类型,再做加法
        INT=*this+INT;
        return INT;
    };
    HugeInteger operator+(string a){  //与上同理
        HugeInteger INT(a);
        INT=*this+INT;
        return INT;
    };

实现相加的原理非常简单,虽然我写得非常凌乱,但主要思想就是小学老师教的加法——列竖式,将两个数右对齐,从个位开始对位相加,得到的数除以10取余,结果即为和的那一位所对应的数字,若整除10的值为1,则需要向左边一位加1。

若数字长度不同,则仅需将较短数字加上即可(循环时以短数字的长度控制循环次数)

实现大整数类的相加后,不同类型的相加可以通过函数复合使用实现

5.第五步:输出大整数类

    friend ostream& operator<<(ostream& os,HugeInteger a){      //重载<<符,实现连续输出
        if (a.integer[0]=='0')    //判断首位是否是0,若为0,则从第二位开始输出                        
        {
            int k;
            k=a.integer.size();
            for (int i=1;i<k;i++)
            {
                os<<a.integer[i];
            }
            return os;
        }
        else
        {
            os<<a.integer;
            return os;
        }
   };

重载输出运算符"<<"实现连续输出
*若第一位为 “0” 则从第二位开始输出
*函数返回类型为输出流,可以实现连续输出

二、测试代码(大整数相加与输出测试程序)

类与测试代码(类内定义函数,直接复制可用)

代码如下(示例):

#include <iostream>
#include <string>
using namespace std;

/* 此处为HugeInteger类的定义和实现 */
class HugeInteger
{
private:
    string integer;               //用string类型储存数值
public:

    HugeInteger(){                //默认为00,其中第一个0为占位符,从第二位开始为数值,输出时可以省略
        integer="00";
    };

    HugeInteger(int a){           //将int类型转化为HugeInteger类型
        string x;
        x=to_string(a);
        integer="0"+x;
    } ;
    HugeInteger(string a){        //将string类型转化为HugeInteger类型
        integer="0"+a;
    };

    HugeInteger operator+(HugeInteger a){       //加法运算符(+)重载,实现HugeInteger类型相加
        HugeInteger INT,max0;
        max0=a;
        INT=*this;

        int Size,Size1,Size2,n=0;

        Size1=INT.integer.size();
        Size2=a.integer.size();

        if (INT.integer.size()>a.integer.size())
        {
            n=1;
            max0=INT;
        };
        if (n==0) Size=Size1;
        else Size=Size2;
        for (int i=0;i<Size;i++)
        {
            int x=0,y=0,z=0;
            x=INT.integer[Size1-i]-'0';     //将那一位对应的字符转换成字符所代表的数字
            y=a.integer[Size2-i]-'0';
            z=x+y;
            x=z%10;
            y=z/10;
            INT.integer[Size1-i]=x+'0';    //将数字转化成字符,再替代此位置字符
            int j=i;
            while(y==1){               //实现加1后连续进位
                if (INT.integer[Size1-j-1]=='9') INT.integer[Size1-j-1] ='0';
                else{
                    INT.integer[Size1-j-1]+=y;
                    y=0;
                }
                j++;
            }
        };

        return INT;
    };
    HugeInteger operator+(int a){     //加法运算符(+)重载,实现HugeInteger类型与int类型相加

        HugeInteger INT(a);           //将int类型转化成HugeInteger类型,再做加法
        INT=*this+INT;
        return INT;
    };
    HugeInteger operator+(string a){  //与上同理
        HugeInteger INT(a);
        INT=*this+INT;
        return INT;
    };

    friend ostream& operator<<(ostream& os,HugeInteger a){      //重载<<符,实现连续输出
        if (a.integer[0]=='0')    //判断首位是否是0,若为0,则从第二位开始输出                        
        {
            int k;
            k=a.integer.size();
            for (int i=1;i<k;i++)
            {
                os<<a.integer[i];
            }
            return os;
        }
        else
        {
            os<<a.integer;
            return os;
        }
    };
};

//此处为测试功能

int main()
{
   HugeInteger n1( 7654321 );
   HugeInteger n2( 7891234 );
   HugeInteger n3( "99999999999999999999999999999" );
   HugeInteger n4( "1" );
   HugeInteger n5;
   cout << "n1 is " << n1 << "\nn2 is " << n2
      << "\nn3 is " << n3 << "\nn4 is " << n4
      << "\nn5 is " << n5 << "\n\n";
   n5 = n1 + n2;
   cout << n1 << " + " << n2 << " = " << n5 << "\n\n";
   cout << n3 << " + " << n4 << "\n= " << ( n3 + n4 ) << "\n\n";
   n5 = n1 + 9;
   cout << n1 << " + " << 9 << " = " << n5 << "\n\n";
   n5 = n2 + "10000";
   cout << n2 << " + " << "10000" << " = " << n5 << endl;

    return 0;
}

以上为全部内容,祝你在学习道路上如履平地 ^_*

  • 16
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值