学习高精度以后,便总是迷迷糊糊的,为了整理,本人决定写一下思路与过程,以方便深刻记住。
先写a+b吧。具体思路从书上了解到,是用加法竖式原理来模拟操作。还要用字符串的知识。那么
先定义两个字符串和它们每位的各个字符。
string a,b;
long long ay[256]={},by[256]={},x[300]={};//出题人良心的话long long能骗不少分
然后将a,b分别拆开并存入ay[i],by[i]中。
for(int i=1;i<=a.size();i++)
ay[i]=a[a.size()-i]-'0';//别忘了size()函数存储的是i-1项
for(int i=1;i<=b.size();i++)
by[i]=b[b.size()-i]-'0';//后面的-‘0’是个小坑
然后是计算,要将a,b的从小至大每位数相加并进位。所以上面存储数组是有要求的,必须将小位存前面。然后,用for循环解决问题,坑又来了,变量i应在什么范围之内,是个问题。我也是参考了别人的代码,才明白i只能在数据最小到最大可能之间。
for(int i=1;i<=250;i++)
{
x[i]+=(ay[i]+by[i])%10;//将每位相加保留一位
if(ay[i]+by[i]>=10)//判断进位
x[i+1]+=1;
}
Now!问题来了,先在若要输出,前面会有许多0,怎么样才能解决呢?我敲了一下。
for(int i=255;i>=1;i--)
{
if(x[i]!=0)
sum=1;
if(sum==1)
cout<<x[i];
}
很高兴,串起来打了个return 0;就提交了,结果,我还是AC了。
本人很懒,就不串了,在下面A-B中参考吧!
至于A-B,都一样,就不写了,牢记借位要逐个判断并借位,区别还是借位。至于A*B和A/B,本人还太菜,等我下几次理思路。
bye!