大整数四则运算算法与实现(C++)

本文介绍了大整数的加减乘除运算,特别是乘法和除法的算法实现。乘法采用手工乘法的思想,通过移位和相加完成。除法利用减法规则和提升位数技巧减少减法操作。针对9655除以23的例子,提出两种提升策略,一种仅提升位数,另一种同时提升位数和倍数。在实际程序中,选择了仅提升位数的方法,因为其在运算次数上更优。
摘要由CSDN通过智能技术生成

 加差法就不用说了,比较简单,乘法的实现也没有什么大的技巧,就是按照手工乘法的思想移位乘相加.对于除法略有技巧,根据减法思想使用提升位数的思想极大的减少了减法运行次数.

 比如 9655/23 ,先根据它们之间的关系将23提升到2300(23*100,只提升位数),再做减法,循环直到被除数等于0或小于除数,同时按位相加中间提升次数即可得结果,另外一种方法和这个类似,只是提升的值不同,对于9655/23,可根据两个数之间关系得一个提升值6900(23*100*3,既提升位数又提升倍数的值,要做一次大整数乘法来求出提升后的值),然后和上面的思路一样,需要说明的是关于得到这个提升值,第一种办法相对固定,提升值也是一样的,对于后一种办法就比较复杂,不同的思路得到的提升值是不同的,由于我还没想到一个不错的提升算法,同时考虑到在我的程序中对这个大整数的存储方式是由高到低,既只提升位数时不用做任何运算,只是改变一下长度即可,另外按照其提升思路,同一位数的提升最坏情况下为9次,并做9次减法,相对后一种提升办法的最好情况是同一位数只提升一次并要做一次乘法,而做一次乘法的时间要远远高于做一次加法,所以我在程序中使用了前者的方法

我的第一种提升的算法思想 

                      // div1为被除数,div2为除数, 整数值由高位到低位依次放在m_int[]中
                     
// result.length-1为首次提升位数
                      int  len1 = div1.length,len2 = div2.length;
    
int  i = 1 ;
    
for (i = 1 ;i <= len2;i ++ )
    
{
        
if(div1.m_int[i]>div2.m_int[i])
        
{
            result.length
=len1-len2+1;
            
break;
        }

        
if(div1.m_int[i]<div2.m_int[i])
        
{
            result.length
=len1-len2;
            
break;
        }

    }

    
if (i > len2)
        result.length
= len1 - len2 + 1 ;
                  

下面为详细代码

 
// bigint.h

#include
< iostream >
#include
< string >
using   namespace  std;
const   int  maxsize = 1000 ;
class  Cbigint
{
private:
    
char m_int[maxsize];
    
int length;
public:
    Cbigint(
char *p=NULL);
    Cbigint(
const Cbigint &c);
    Cbigint::Cbigint(
long n);
    
void sinmult(
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值