用字符串模拟两个大数相加

 package cn.com.hadoop;
/**
* 用字符串模拟两个大数相加,计算机中整型数据都是有范围的,不能无限大;突然想到了小学时候的列竖式进行笔算
* @author gaojingsong
*/
public class Demo {
/**             1897
  思路:         +   56                                                
      
1.对齐两个字符串,即短字符串的高位用‘0’补齐,便于后面的相加;(1897,0056) 
2.反转两个字符串,便于从低位到高位相加和最高位的进位导致和的位数增加;(7981,,65 00)    
   3.把两个正整数相加,一位一位的加并加上进位。 
         (7+6=13  9+5+进位1=15 8+0+进位1=9 1+0=1)  
         3        5         9           1 因此结1953                  
  */
public static void main(String[] args) {
  add("991","23");
  add("1897","56");
  //java.math.BigInteger a2 = new java.math.BigInteger(a);
}
/**
  * 1、取得两个字符串的长度,把长度较短的字符串,在左面补0,使之与较长字符串一样长
   * 2、长度相同反转字符串,从个位开始进行累加,字符串每位取出来相加,
       如果大于10则进位,结果位为相加和减去10
  * @param n1
  * @param n2
  * @return
  */
public static String add(String n1, String n2) {
  StringBuffer result = new StringBuffer();
  // 一、反转
  StringBuffer num1 = new StringBuffer(n1).reverse();
  StringBuffer num2 = new StringBuffer(n2).reverse();
  // 二、补齐,把两个字符串补齐,即短字符串(反转后短字符串的最低位)的高位用0补齐,
  int len1 = num1.length();
  int len2 = num2.length();
  int maxlength = len1 > len2 ? len1 : len2;
  if (len1 > len2) {
   for (int i = len2; i < len1; i++) {
    num2.append(0);
   }
  } else if (len1 < len2) {
   for (int i = len1; i < len2; i++) {
    num1.append(0);
   }
  }
  // 三、逐位相加,把两个正整数相加,一位一位的加并加上进位
  int overNum = 0;      //溢出数量,个位数相加最多进一位
  boolean hinghtLocOverFlow = false;//是否越界
  for (int i = 0; i < maxlength; i++) {
   int num3 = overNum
     + Integer.parseInt(String.valueOf(num1.charAt(i) + ""))
     + Integer.parseInt(String.valueOf(num2.charAt(i) + ""));
   if (num3 >= 10) {
    result.append(num3 - 10);
    overNum = 1;//每位相加满十则进一
    //判断最后一位是否会溢出满10,满十则进一位
    if (i == maxlength-1) {
     hinghtLocOverFlow = true;
    }
   } else {
    overNum = 0;
    result.append(num3);
   }
   //如果溢出的话表示位增加了
   if (hinghtLocOverFlow) {
    result = result.append(1);
   }
  }
  String res = result.reverse().toString();
  System.out.println(res);
  return res;
}
}

猜你喜欢

转载自gaojingsong.iteye.com/blog/2252294