大整数加法计算思路与算法实现

参加MOOC PKU的程序设计专项课程学习,目前进度到C++。这门课太烂了,完全就是自学,作业还相当难!!!!比如这里week4的这题,其实是把poj上的大整数的加、减、乘、除合并到一题里面,这个代码量很恐怖。当然了,通过查找相关资料,终于学习了,如何实现大整数的高精度四则运算,这也是程序员面试的一道经典题。其实具体的思路就是小学竖式计算,但是代码实现的过程,比较抽象。先说说大整数加法。

0、编写大整数类结构

使用数组存储所有操作数,定义数组大小200。定义一个全局变量,存运算符,因为减法运算中有可能需要输出负号。定义一个布尔变量,用于区分减法的三种情况。

#include <iostream>
#include<cstring>
#include<cstdlib>
#define MAX_LEN 200
char o;                              /*全局运算符*/
bool cannotSub=0;                    /*不够减标记,区分减法的情况*/
char szLine1[MAX_LEN+10]={0};         /*输入输出的字符数组*/
char szLine2[MAX_LEN+10]={0};

成员变量2个。一个是数组的首地址,用整型指针。另一个是存储数组的大小,用int型。
成员函数包括构造函数、赋值号重载函数以及四则运算符号的重载函数和一个倍增函数(用于将数扩大为原来的10n倍)。

class  bigNum
    {
    public:
        bigNum():sInt(NULL){ len=0; }    /*构造函数*/
        ~bigNum(){ if(sInt)    delete[] sInt; }/*析构函数*/
        const int * getint(){ return sInt; }  /*返回数组首地址*/
        bigNum & operator= (char *s);       /*赋值号重载函数*/
        bigNum & operator= (bigNum & b);    /*实现深复制,即指向内容之间的复制*/
        friend void operator+ (bigNum & result,bigNum & b);/*加号重载*/
        friend void operator- (bigNum & result,bigNum & b);/*减号重载*/
        friend void operator* (bigNum & result,bigNum & b);/*乘号重载*/
        friend void operator/ (bigNum & result,bigNum & b);/*除号重载*/
        friend void multi10 (bigNum & b,int n);/*倍增函数*/ 
    private:
        int *sInt;            /*实际进行四则运算的整型数*/
        int len;              /*数组长度*/
    };

赋值号重载函数的作用,

  • 1、是实现主函数中字符串存储为整型数组,因为用主函数中定义了char型数组cin输入的是ASCII码,需要减去’0’的ASCII码再存储为整型数组。输入用字符数组,因为有一些函数可以直接使用,如求字符串长度等等。
  • 2、是实现对象之间的深复制,也就是对象所指向内容之间的拷贝。
  • 3、是实现动态分配数组的存储空间。

一、大整数加法

1、思路

大整数加法的思路,就是竖式计算,逐项相加。考虑进位,就是逢十进一,也就是说如果某一位大于等于10,减去10就是本位和,然后下一位++,这就是进位。加法最多就是进1位

2种情况.不进位加法:

 1234

+4321

5555 

进位加法

 999

+888

887

2、 算法

运用数组存储两个加数,右对齐逐位相加,如果和大于或等于10,和减10,同时下一位被加数++。

/*加号重载,实现result+b*/
    void operator+ (bigNum & result,bigNum & b)
    {
        for( int i = 0;i < MAX_LEN+10 ; i ++ )
        {
             result.sInt[i] += b.sInt[i]; //逐位相加
             if( result.sInt[i] >= 10 )
                 { //看是否要进位
                result.sInt[i] -= 10; //本位和
                result.sInt[i+1] ++; //下一位进位
             }
        }
    }
  • 4
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值