c++算法系列one:高精度计算&&信息学奥赛一本通1169大整数减法代码

  • Post author:
  • Post category:其他


最近这几天,粉丝一直在催更,

在这里插入图片描述

回归主题,大家好我是屁孩君。

今天给大家来简单地讲解一下高精度计算。

在c++刷题网站上大家应该都做到过高精度加法,大整数减法,高精度乘法,高精除低精…本想着用long long去解决简单得很,简直就是一道送分题,可是提交一看,what,答案错误,出现一大堆负数。这时的问题就出在那个数大于long long的取值范围,所以才会出现错误。这时,我们就得运用高精度计算了。

1.高精度计算中需要处理好数据的接收与存储方法,数据太长的时候,可以用字符串的形式输入,这样可以利用字符串函数和操作进行运算,将每一位数取出,存到你定义的数组里,下面是操作代码

void f(int g[])传进一个数组
{
		string a;
		cin>>a;
		len=a.length();
		for(q=1;q<=len;q++)
			g[i]=s[len-i]-'0';
}

还有一种方法是直接用循环+数组的方法读入数据

2.高精度数位数的确定

接受用的是字符串,它的位数等于字符串的长度,注意,字符串是从0开始的。

3.进位与、借位的处理,我个人觉得就像是写竖式一样

加法的进位

c[i]=a[i]+b[i];
if(c[i]>=10)
{
c[i]%=10;++c[i+1];
}

减法借位

if(a[i]<b[i])
{
--a[i+1];++c[i+1];
}

乘法进位

c[i+j-1]=a[i]*b[j]+x+c[i+j-1];
x=c[i+j-1]/10;//最多有几个十
c[i+j-1]%=10;

好了这里就是今天的算法部分了!

古德拜!

诶诶,1169大整数减法代码还没给大家呢!嘴瓢了!

来看代码!

#include<bits/stdc++.h>
using namespace std;
int a[210],b[210],lena,lenb;
string a1,b1;
int main(){
    cin>>a1>>b1;
    lena=a1.size();
    lenb=b1.size();
    for(int i=0;i<lena;i++)a[i]=a1[lena-i-1]-'0';
    for(int i=0;i<lenb;i++)b[i]=b1[lenb-i-1]-'0';
    for(int i=0;i<lena;i++)a[i]-=b[i];
    for(int i=0;i<lena;i++)
        if(a[i]<0){
            a[i]+=10;
            a[i+1]--;
        }
    while(lena&&a[lena]==0)lena--;
    for(int i=lena;i>=0;i--)cout<<a[i];
    cout<<endl;
}

这下才可以说古德拜了!

好了今天屁孩君就给大家分享到这里了!

古德拜!

记得三连哦!



版权声明:本文为weixin_60626543原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。