欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-03-25 16:29:42
...
 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;
}
}