高精计算~~~
诶,讲什么来着???
高精?!
好吧,步入正题:
高精有好多种来着,高精加,高精减,高精乘,高精除;
高精除又有两种,一个是高精除低精,一个是高精除高精。
首先是存储,因为数值极大,所以用字符串存储比较合适
然后倒序存储,如下:
void init(int a[]){//传入数组string s;cin>>s;//读入字符串sa[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
#include
#include
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<cout<return 0;
}
这题有一些地方是不全面的,
嗯。。。
例如说,在这一道题中并不要求要负数求值
所以一些复杂的东东就没有了!!!
(嘻嘻,其实少掉的东西是一个if判断啦!!!)
这里的if判断的是数之前有无负号,这样就要相应的改变一些代码去适应一下负号,即高精减!!!
还有就是这个代码中并没有函数,而是把函数中的东西都写到了主函数中了,这个是有迹可循的,具体的我有标注一些。
希望对大家有用啦!!!
高精加也就这些啦,希望大佬们给给点评!!!(如果有 新的理解我还会修改的!!!)
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
