今天让我们进入算术天地,高精度の快乐计算!!
首先第一步,
高精度的读入!!
我们可以用一个数组来保存整个高精度整数,并记录高精度整数的长度len。为了便于之后的计算,我们都会在读入时把这个整数倒置,也就是说a0保存个位数字,a1保存十位数字······
代码的话,Look like this:
string num;
cin >>num;
int a[105];
int len = num.size();
for(int i = 0;i<len;i++){
a[i] = num[len-1-i]-'0';//注意这里要减去‘0’,因为我们要把字符‘0’变为整数‘0’
}
再说,就是另一个难点,高精度的计算(加减乘除):
First,
加法运算
一次计算,难免会碰上进位的时候,所以最最关键和基础的一步就是进位儿!
中间的推导过程,就不讲了,但是!!
划重点\(^o^)/~!!
计算过程的理论解释:
1.将要加的数加到高精度数组下标为0的位置上,当前指向这一位。
2.让下一位数加上当前位上的数除以10的商,当前位上的数对10取模。
3.向后移动一位,继续执行第二步操作。
这样的关键代码如下哦:
int a[105],x,len;
//将高精度读入到a,倒叙放置
//高精度的位数记为len
//将单精度读入到x
a[0] += x;
for(int i = 0;i < len;i++){
a[i+1] += a[i]/10;
a[i]%=10;
}
另外,对每一位进行完进位操作后,还需判断a[len]是否大于0,如果大于了0,就需要考虑进位操作并将长度加1!关键代码如下:
while(a[len]){
a[len+1] += a[len] / 10;
a[len] %= 10;
len++;
}
Second,
减法运算
划重点!!
高精度减法的过程和高精度加法的过程是非常相似的。我们来看一下计算过程:
1.在高精度数组下标为0的位置减去单精度整数,当前指向这一位。
2.如果当前位上的数小于0,就上当前指向的下一位减去1,并让当前位置加上10,直到当前位置不小于0
3.向前移动一位,继续执行第二步操作
除了上述过程和加法有所差异以外,最后的长度处理也与加法有所不同。进行加减操作以后,高精度整数的总长度有可能变小,所以需要判断是否当前高精度数的最高位是0,核心代码如下:
a[0]-=x;
for(int i = 0; i < len ; i++){
while(a[i] < 0)
a[i+1]--;
a[i] += 10;
}
while(len > 1 && a[len-1] == 0){
len--;
}
故,今天的加减法小课堂就结束啦!!
喜欢我的课程的,希望点赞o( ̄▽ ̄)d和关注哦!!
(*^▽^*)(*╹▽╹*)