序言介绍
前几天参加一个抽签活动,我看着它给的抽签规则那么详细,就萌发了想自己编程计算结果的想法。但是发现,里面遇到的运算虽然是乘法和减法,但涉及的不是寻常数字,而是大数。这个是我之前没遇到的,所以带着好奇和求知的努力,这篇文章出现了。
什么是大数
大数可能很多人第一感觉就是很大的数,我也是这么理解的。我觉得所有不能用编程语言已有的数字类型表示的数都可以叫大数。比如50!或者2的50次方,都远超出了int的范围。就算在long或者double表示范围内的,那它的运算绝对也不简单。
另外,大数在面试或者算法里也常常出现。
运算–乘法
我先做乘法的原因很简单,开头故事里的抽签规则就是先做的乘法。
先说下我的思路,不考虑负数(虽然判断一下也很简单)、复数、几进制等问题,采用竖式乘法,用一个二维数组存放大数和结果,每个元素都是0到9的一位数字。如果超过了9,分别用除以10和对10取模得到十位和各位的数字。然后按照数学运算法则,个位保留,十位数进位。最后,我选择二位数组,也是我想到这样和真正的竖式乘法很相像。
我画了一个草图,123*34的运算。右边更好的示意我的思路,从下标小的位置代表数字的低位,0一行表示了“34”中各位4乘以“123”后的结果,按照上一段的描述,一位一位的乘,然后保证超过10就进位。1一行,开始的0原理和竖式乘法中十进制的“3”乘以“123”一样。最后红色那一行同理。
最后拿到了数组,可以拼接成字符串,然后去零,再逆序一下。以为这里是低位在前。
代码
import java.util.Scanner;
public class BigNumber {
public static void main(String[] args) {
BigNumber bigNumber = new BigNumber();
Scanner sc = new Scanner(System.in);
String fString = sc.nextLine();
String sString = sc.nextLine();
int fPoint = 0, sPoint = 0;
while (fString.endsWith("0")){
fPoint = fPoint +1;
fString = fString.substring(0, fString.length()-1);
}
while (sString.