高精度加法 什么是高精度加法了?也就是说,当两个数过大的时候,用基本数据类型,无法进行操作时,我们可以这样做,用两个字符数组,s1,s2,进行输入,存储用于加法的两个数,又定义三个数组,a,b,c进行,运算,因为,我们在进行加法运算时,是从低位到高位进行逐位相加,进位操作,所以最初输入的s1,s2字符数组,不仅要进行转换为数组,还要逆序存储在,整型数组a,b中,我们可以知道,两个数相加的话,那么它的和的位数最多,比这两个数中的最大的位数多一位,于是,我们可以得到和的位数,用来作为for循环的上界,然后是搞进度的核心部分,这里需要注意的是,进位,那么如何进位了,我们知道当i=1时,c[i]+=a[i]+b[i],至于为什么要加等于了,哈哈,我们可以先看下一位,i=2时,假设,前面有进位,那么,如果是直接赋值的话,我们就得不到,进位的值了,所以需要进行加等于,然后是整除得到进位值,以及,当a[i]+b[i]大于十时,取余得到余下的值,最后,再进行删除前导零,因为最后的相加,可能进位,也可能不进位,这时多出来的一位如果不删除的话,逆序输出时,会存在前导零。
#include <bits/stdc++.h>
using namespace std;
int a[505],b[505],c[505];
char s1[505],s2[505];
int main()
{
int la,lb,lc;
scanf("%s",s1);
scanf("%s",s2);
la=strlen(s1);
lb=strlen(s2);
for(int i=0;i<la;i++)
a[la-i]=s1[i]-'0';
for(int i=0;i<lb;i++)
b[lb-i]=s2[i]-'0';
lc=max(la,lb)+1;
for(int i=1;i<=lc;i++)
{
c[i]+=a[i]+b[i];
c[i+1]+=c[i]/10;
c[i]=c[i]%10;
}
if(c[lc]==0 && lc>0) lc--;
for(int i=lc;i>0;i--)
printf("%d",c[i]);
return 0;
}
高精度减法 下面是高精度减法,这里依然是借助数组进行运算,和高精度加法不同的是,这里需要进行定义一个函数进行比较减数与被减数之间的大小,当被减数小于减数时要进行交换两者,并标记为1,标记为1,也就是说最终结果需要输出一个负号,这里有很多和高精度加法相似的地方,我就不说了,来讲一讲高精度减法的核心,也就是,进行借位,依次遍历每一个数当a[i]<b[i]时,这时,需要借位,那么a[i+1]就需要减1,对于a[i]来说相当与加10; 最后得到结果,消去前导零输出,注意和加法不同的是这里用的是while,因为,减法的前导零可能不只有一个。
#include <bits/stdc++.h>
using namespace std;
char s1[10090],s2[10090],s3[10090];
int a[10090],b[10090],c[10090];
int flag=0;
bool compare(char s1[],char s2[])
{
int u=strlen(s1),v=strlen(s2);
if(u!=v) return u>v;
for (int i=0;i<u;i++)
{
if(s1[i]!=s2[i])
return s1[i]>s2[i];
}
return true;
}
int main()
{
int la,lb,lc;
cin>>s1>>s2;
if(!compare(s1,s2))
{
flag=1;
strcpy(s3,s1);
strcpy(s1,s2);
strcpy(s2,s3);
}
la=strlen(s1);
lb=strlen(s2);
for(int i=0;i<la;i++)
{
a[la-i]=s1[i]-'0';
}
for(int i=0;i<lb;i++)
{
b[lb-i]=s2[i]-'0';
}
lc=max(la,lb);
for(int i=1;i<=lc;i++)
{
if(a[i]<b[i])
{
a[i+1]--;
a[i]+=10;
}
c[i]=a[i]-b[i];
}
while(c[lc]==0 && lc>1) lc--;
if(flag==1) cout<<"-";
for(int i=lc;i>0;i--)
cout<<c[i];
return 0;
}
高精度乘法 还是和前面的高精度加法和减法,有很多类似的地方,核心就是,要找到c[i+j-1]+=a[i]*b[j](可以到纸上写一写)然后就是这里的双层循环了。
#include <bits/stdc++.h>
using namespace std;
char s1[2005],s2[2005];
int a[2005],b[2005],c[2005];
int main()
{
int la,lb,lc;
scanf("%s",s1);
scanf("%s",s2);
la=strlen(s1);
lb=strlen(s2);
for(int i=0;i<la;i++)
{
a[la-i]=s1[i]-'0';
}
for(int i=0;i<la;i++)
{
b[lb-i]=s2[i]-'0';
}
lc=la+lb;
for(int i=1;i<=la;i++)
{
for(int j=1;j<=lb;j++)
{
c[i+j-1]+=a[i]*b[j];
c[i+j]+=c[i+j-1]/10;
c[i+j-1]%=10;
}
}
if(c[lc]==0 && lc>0) lc--;
for(int i=lc;i>0;i--)
printf("%d",c[i]);
return 0;
}
高精度除法(高精度除以低精度) 逐位试商法, 这里是用一个高精度的数除以一个低精度得数,那么如何进行操作了?首先,定义需要用到得量,字符数组用于存储被除数,这里和前面得有所不同,将字符数转换为数字直接存放在a中就可以了,因为我们在用逐商试余法时,进行的就是,从高位到低位,在核心部分,我们用到了一个x,这个x说白了就是,一个余数,初始化为零,注意,对于全局变量来说,他是默认为0的,这个余数进行乘10操作,并加被除数数组的下一位当作下一轮的被除数,就像这样,从被除数中,不断的取一位,进行和除数相除得到一个商和一个余数,这个余数乘以10再和被除数数组的下一位相加作为被除数
#include <iostream>
#include <cstring>
using namespace std;
char s1[5005];
long long b,c[5005],x,a[5005],la,lc;
int main()
{
cin>>s1>>b;
la=strlen(s1);
for(int i=1;i<=la;i++) a[i]=s1[i-1]-'0';
for(int i=1;i<=la;++i)
{
c[i]=(x*10+a[i])/b;
x=(x*10+a[i])%b;
}
lc=1;
while(c[lc]==0 && lc<la) lc++;
for(int i=lc;i<=la;++i) cout<<c[i];
return 0;
}
高精度除以高精度 待更新
给我点个赞再走呗。
https://www.bilibili.com/video/BV1LA411v7mt?p=5&spm_id_from=pageDriver
|