声明
作者非职业程序员,本文仅在分享自己的心得,错误较多欢迎指出,各位大佬不喜勿喷
本文采用Java语言
写得有些草率哈,请谅解:P
To be continued.仍在更新。
一、什么是高精度
在计算中,往往需要对一些大数字进行运算。这里的“大数字”往往达到几百位几千位,不是单单一个int就能存下的。那么如何对它们进行计算呢?那就把老祖宗的东西搬出来——竖式。
竖式是啥呀?就是把一个数中的数字列出来,一位一位进行操作。比如用竖式计算18654186+524139:
a | 1 | 8 | 6 | 5 | 4 | 1 | 8 | 6 |
---|---|---|---|---|---|---|---|---|
+b | +1 | 5 | 2 | 4 | 1+1 | 3+1 | 9 | |
=ans | 1 | 9 | (1)1 | 7 | 8 | 3 | (1)2 | (1)5 |
用程序实现时,以字符串存储数,从最后一位开始计算,并及时处理进位
二、代码实现
1.高精加
所有要点已写在注释中
package 高精度;
import java.util.Scanner;
public class gaojingdu {
public static void main(String[] args) {
//输入
System.out.println("输入两个加数(自然数,不含前导零):");
Scanner scanner=new Scanner(System.in);
String s1=scanner.nextLine();
String s2=scanner.nextLine();
int i=0,a=0;
//找到最长的那个数的长度来确定储存两个加数的数组的长度,防止出现一个数太短,在另一个数的某位与这个数的这一位相加时由于对应数位上没有数字引发错误
int l=s1.length();
if(l<s2.length()) {
l=s2.length();
}
int[] first=new int[l];
int[] second=new int[l];
//这里的l作为数的长度,与每个数相应字符串长度匹配
//“0”储存了个位,下标越大数位越靠前
l=s1.length();
for(i=l-1;i>=0;i--) {
a=(int)s1.charAt(i)-48;
first[l-i-1]=a;
}
l=s2.length();
for(i=l-1;i>=0;i--) {
a=(int)s2.charAt(i)-48;
second[l-i-1]=a;
}
//重新找到最长的数的长度,因为和的长度一定大于等于这个长度。a位数与b位数相加,和一定是(a+b)位数或(a+b+1)位数。
l=s1.length();
if(l<s2.length()) {
l=s2.length();
}
//和的长度要比最长加数长度多一,确保在“a位数加b位数得到(a+b+1)位数”时有空间储存进位上来的1
int[] ans=new int[l+1];
int k=0;
//从个位开始加
for(i=0;i<l;i++) {
//和的某个数位=两个加数的对应数位之和+前一位的进位
ans[i]=first[i]+second[i]+k;
//计算完后清空进位,否则k会越来越大
k=0;
//处理进位
if(ans[i]>9) {
//向下一个处理的数位进一位
k++;
//十进制中进一位相当于在这一位-10
ans[i]=ans[i]-10;
}
}
//如果最后还有进位,把它放在之前预留的空间内
ans[l]=k;
//输出
System.out.println("两数之和为:");
//输出前先判断最后有没有进位,有就单独输出。如果不考虑这一步,后面整体输出可能会有前导零(第一位的0)
if(k!=0) {
System.out.print(ans[l]);
}
//整体输出,倒着输出,因为最后处理的数位在竖式中反而是第一(二)位,而最先处理的数位是个位——最后一位
for(i=l-1;i>=0;i--) {
System.out.print(ans[i]);
}
}
}
样例
>输入两个加数(自然数,不含前导零):
26999↙
5↙
>两数之和为:
>27004
To be continued未完待续……