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



