诶,讲什么来着???
高精?!
好吧,步入正题:
高精有好多种来着,高精加,高精减,高精乘,高精除;
高精除又有两种,一个是高精除低精,一个是高精除高精。
首先是存储,因为数值极大,所以用字符串存储比较合适
然后倒序存储,如下:
void init(int a[]){//传入数组 string s; cin>>s;//读入字符串s a[0]=s.lenth();//a[0]为字符串s的位数,极为重要!!! for(int i=1;i<=a[0];i++) { a[i]=s[a[0]-i]-'0';//将字符串s转为数组a,并倒序存储 } }
高精加:
既然是加法,就需要进位!进位!进位!(重要的事情说三遍)
进位解决的方法就是:
c[i]=a[i]+b[i];//逐位相加c[i]为进位数 if(c[i]>=10){//进位处理(加法中大于十进位) c[i]%=10; ++c[i+1];//上一位加十 }
算法描述是这样纸的:
int c[Maxn]; inline void add(int a[],int b[]){//a,b,c都是数组,分别存储被加数,加数以及结果 int i=1,x=0;//x是进位的值 while((i<=lena)||(i<=lenb)){//lena和lenb分别是a和b的数组长度 c[i]=a[i]+b[i]+x;//第i位相加并加上上次的进位 x=c[i]/10;//向高位进位 c[i]%=10;//存储第i位的值 i++//位置下标 } }
嗯嗯,就是这样纸了。
这个其实大家都知道啦,加法就是这样,所以底下来一道例题!!!
例题:
洛谷P1601
先上代码:
#include<iostream> #include<cstdio> #include<cstring> using namespace std; int main() { char a1[100],b1[100]; int a[100],b[100],c[100],lena,lenb,lenc,i,x; memset(a,0,sizeof(a)); memset(b,0,sizeof(b)); memset(c,0,sizeof(c)); scanf("%s",a1); scanf("%s",b1); lena=strlen(a1);//输入加数与被加数 lenb=strlen(b1); for (i=0;i<=lena-1;i++) a[lena-i]=a1[i]-48; //将加数轻轻的放入a数组 for (i=0;i<=lenb-1;i++) b[lenb-i]=b1[i]-48;//将被加数扔进b数组 lenc =1; x=0; while (lenc <=lena||lenc <=lenb) { c[lenc]=a[lenc]+b[lenc]+x;//两数相加相当于:“c[i]=a[i]+b[i];”这个 x=c[lenc]/10; c[lenc]%=10; lenc++; } c[lenc]=x; if (c[lenc]==0) lenc--; for (i=lenc;i>=1;i--) //处理最高位 cout<<c[i]; cout<<endl; return 0; }
这题有一些地方是不全面的,
嗯。。。
例如说,在这一道题中并不要求要负数求值
所以一些复杂的东东就没有了!!!
(嘻嘻,其实少掉的东西是一个if判断啦!!!)
这里的if判断的是数之前有无负号,这样就要相应的改变一些代码去适应一下负号,即高精减!!!
还有就是这个代码中并没有函数,而是把函数中的东西都写到了主函数中了,这个是有迹可循的,具体的我有标注一些。
希望对大家有用啦!!!
高精加也就这些啦,希望大佬们给给点评!!!(如果有 新的理解我还会修改的!!!)