C++ 算法学习——1.6 高精度算法(string类的注意)

高精度算法,旨在处理 一般数据类型承载不了的体量

可以分为输入,处理,输出三个方面的研究。

对输入部分:可以采取string类型记录数据,或字符数组。

对处理部分:可以采用string相关的函数,或对每一位字符处理精细处理。

对输出部分:输出位string 类型;或按要求取模输出;或字符数组。

P1. 洛谷1601高精度正数加法为例

#include<iostream>
#include<algorithm>
#include<string.h>
using namespace std;

int main()
{
    string numa,numb;
    cin>>numa>>numb;
    int bitsnum=(numa.length()>=numb.length()?numa.length()+1:numb.length()+1);//length()直接得到有效个数
    int paddingnuma=bitsnum-numa.length();int paddingnumb=bitsnum-numb.length();
    numa.insert(0,paddingnuma,'0');
    numb.insert(0,paddingnumb,'0');//insert(0,a,字符b)即在某个0位置前添加a个字符b
    reverse(numa.begin(),numa.end());
    reverse(numb.begin(),numb.end());//string类中,输入abc,则a为第0位,考虑用reverse翻转
    
    char* calc=new char[bitsnum];
    int carry=0;
    for(int i=0;i<bitsnum;i++)
    {
        calc[i]=char((numa[i]-48+numb[i]-48+carry)%10+48);
        carry=(numa[i]-48+numb[i]-48)/10;
    }

    int beginspot=bitsnum-1;
    while(calc[beginspot]=='0') beginspot--;
    for(int i=beginspot;i>=0;i--) cout<<calc[i];

    return 0;
}

P2. 高精度乘法

注意我没有用char存储结果,因为我采用最终顺一遍result数组的方式,char数组存储可能越界成赋值。这样做稍微显得不自然。

#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;

int main()//注意,使用本算法时,char数组无法用来一次性装结果,需要int存储最终结果
{
    string a,b;cin>>a>>b;
    int lengtha=a.length();int lengthb=b.length();
    int* result=new int[lengtha+lengthb+1]{0};
    int adda=lengthb;int addb=lengtha;
    a.insert(0,lengthb,'0');
    b.insert(0,lengtha,'0');

    //cout<<a<<endl<<b<<endl;
    
    int totalnums=lengtha+lengthb-1;
    for(int i=totalnums;i>0;i--)
    {
        for(int j=totalnums;j>0;j--)
        {
            int carry=(a[i]-'0')*(b[j]-'0')/10;
            int resultp=((a[i]-'0')*(b[j]-'0'))%10;
            result[i-(totalnums-j)]+=resultp;
            result[i-(totalnums-j)-1]+=carry;
        }
    }

    for(int i=totalnums;i>0;i--)
    {
        //cout<<int(result[i])<<" ";
        int finalresult=result[i]%10;
        int finalcarry=result[i]/10;
        result[i]=finalresult;
        result[i-1]+=finalcarry;
    }

    int beginspot=0;
    while(result[beginspot]==0) beginspot++;
    for(int i=beginspot;i<totalnums+1;i++) cout<<result[i];

    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值