处理处理字符串型大数加法问题

前言:

最近好久没有写文章了,因为最近忙着期末考试,然而还是挂了一门英语(英语是硬伤啊-_-)…… 昨天,我去面试,面试官出了一道大数加法编程问题,因为是机试,所以当时觉得写得有些潦草,也没有注释,所以今天重新整理了一下思路,重新写了一遍。

题目描述:

给你两个用字符串表示的数字a 和 b,数字之中无非法字符(如abc、@#¥等字符),让我实现这两个整数的加法。

分析:

因为用a 和 b这两个数字是大数,所以我们用integer类直接将字符串类型的数字转换成int类型的数字是不可取的(因为int类型有范围限制:- 2^31 ~ 2^31 - 1);那这时,我们就剩一种方法去进行字符串的加法运算了,我们首先找出两个字符串中长度较小的那个字符串,然后根据这个字符串的长度对两个字符串从尾到头开始进行单个字符的加法运算,这里需要处理进位的问题;处理完这个加法后,我们现在需要处理长度大的那个字符串的高位运算,这里我们还是需要处理低位的进位问题。

程序实现如下:

package package_20180720;

/**
 * 
 * @author 康茜
 *	问题:处理字符串型大数加法问题
 */
public class Main1 {
	public static String sum(String a, String b) {
		StringBuffer result = new StringBuffer();
		//默认valueA的长度大于valueB的长度
		StringBuffer valueA;
		StringBuffer valueB;
		if(a.length() > b.length()) {
			valueA = new StringBuffer(a).reverse();
			valueB = new StringBuffer(b).reverse();
		} else {
			valueA = new StringBuffer(b).reverse();
			valueB = new StringBuffer(a).reverse();
		}
		
		//处理两个字符串的低位部分(这里指的是两个字符串都拥有的低位部分)
		//如:a = 123456 b = 123,则低位部分是 456 和 123
		boolean lowCarryTag = false;
		for(int i = 0; i < valueB.length(); i++) {
			char ch1 = valueA.charAt(i);
			char ch2 = valueB.charAt(i);
			
			int value = 0;
			if(lowCarryTag) {
				value = Integer.parseInt(String.valueOf(ch1)) 
						+ Integer.valueOf(String.valueOf(ch2)) + 1;
			} else {
				value = Integer.parseInt(String.valueOf(ch1)) 
						+ Integer.valueOf(String.valueOf(ch2));
			}
			//根据value判断是否需要设置进位标志lowCarryTag
			if(value > 9) {
				lowCarryTag = true;
			} else {
				lowCarryTag = false;
			}
			result.append(String.valueOf(value%10));
		}
		
		//处理字符串高位部分,这里需要考虑低位部分的进位问题
		String highValueA = valueA.substring(valueB.length());
		//System.out.println("highValueA.length:" + highValueA.length());
		if(lowCarryTag) {
			boolean highCarryTag = true;
			//如果两个字符串长度相等,则不需要处理高位字符部分了(即不执行循环),
			//只需要把低位的进位1加上,在循环后根据highCarryTag将进位加上
			for(int j = 0; j < highValueA.length(); j++) {
				char ch = highValueA.charAt(j);
				int value = 0;
				if(highCarryTag) {
					value = Integer.parseInt(String.valueOf(ch)) + 1;
				} else {
					value = Integer.parseInt(String.valueOf(ch));
				}
				if(value > 9) {//置高位进位标志
					highCarryTag = true;
				} else {
					highCarryTag = false;
				}
				result.append(String.valueOf(value%10));
			}
			//处理最顶位是否还需要进位
			if(highCarryTag) {
				result.append(String.valueOf(1));
			}
		} else {//低位部分没有进位,那么我的高位部分则不会变,直接将剩余字符串加到结果上
			result.append(highValueA);
		}
		
		return result.reverse().toString();
	}
	
	public static void main(String[] args) {
		System.out.println(sum("9999", "9999"));
		System.out.println("=====================");
		
		System.out.println(sum("9999", "1"));
		System.out.println("=====================");
		
		System.out.println(sum("9999", "11"));
		System.out.println("=====================");
	}
}

猜你喜欢

转载自blog.csdn.net/kangxidagege/article/details/81127490