问题
某个开发小组在进行项目开发时遇到了一个问题,他们需要进行一个超大的整数的求和运算,例如9239293919+67267627367,而int的范围远远不够,此时他们想到,可以将这些数字分别存放到两个长度相同的数组中,然后再根据其长度创建一个等长的数组,接下来就可以按照下标对数组的每一位来进行求和,最后可以得到一个保存了结果数据的数组。
问题分析:
本问题实际要完成的是对数组的操作,由于数组中每个数字是一个个的数组元素,看似独立,实则是需要作为一个整体来看待,由于进行加法运算时需要从个位开始加起,意味着对数组元素的访问需要从数组的最后一个元素往前进行,另外每一位上的数字经过加法运算后可能产生进位也是需要注意的,如果产生了进位,则当前结果数组的元素只保留和值的个位,并将产生的进位1先累加到a或者b的下一位上。另外计算过程中可能会存在进位而改变了原数组的内容,所以需要提前输出加法的式子,然后进行求和运算,再输出结果,而输出时,考虑到前面可能存在0,因此输出时需要找到第一个不为0的数字开始输出。
算法设计:
第一步,先输出加法式子,通过循环进行数组数字的输出,注意开头的0不可输出;
第二步,需要根据当前已有的数组长度来创建一个存储目标结果的数组;
第三步,建立循环,因为两个数组等长,所以只需要一个循环,从数组的最后一位往前遍历,对每一位元素进行计算,并判断结果是不是大于等于10,如果是则产生进位,结果数组中的元素只保留其个位,进位的1先累加到a或者b数组的下一个位上;
第四步,计算完成后,再通过循环输出结果数组中的数字,同样开头的0不可输出。
代码
public class Handle {
public static void add(int[] a, int[] b) {
int[] c = null;
c = new int[a.length];
int temp = 0;
for (int i = a.length - 1; i >= 0; i--) {
c[i] = (a[i] + b[i] + temp) % 10;
temp = (a[i] + b[i] + temp) / 10;
}
Jude_Print(a);
System.out.print("+");
Jude_Print(b);
System.out.print("=");
Jude_Print(c);
System.out.println();
}
public static void Jude_Print(int[] d) {
for (int i = 0; i < d.length; i++) {
if (d[i] != 0) {
for (; i < d.length; i++) {
System.out.print(d[i]);
}
break;
}
}
}
public static void main(String[] args) {
int[] a = {1, 8, 9, 7, 0, 4, 3, 5, 8, 0, 4, 2, 7, 8, 5, 6, 8, 5, 8, 5, 9, 9};
int[] b = {0, 2, 0, 0, 2, 8, 6, 8, 2, 1, 5, 3, 9, 6, 4, 0, 4, 2, 0, 1, 4, 9};
add(a, b);
}
}
运行结果