• Java语言实现两个超级大数相加


    两个超级大数相加

    当两个数num1, num2特别大的时候,也就是超级大数,用int, long 明显不足。
    在num1 和num2 的长度都小于 5100,不包含任何前导零并且不使用任何內建 BigInteger 库时,可以转换成字符串,逐个字符处理。
    Java语言(使用StringBuilder 对象):

    public class SuperLargeNumberAddition {
    	public static String stringAdd(String num1, String num2) {
    		// 存放结果的 StringBuilder 对象
    		StringBuilder resultstr = new StringBuilder();
    		
    		// numlength1, numlength2 表示字符串 num1, num2 的长度. carry 代表进位
    		int numlength1 = num1.length()-1, numlength2 = num2.length()-1, carry = 0;
    		int x, y, sum;
    		// 当 num1,num2 结束 并且不需要进位的时候退出循环
    		while(numlength1 >= 0 || numlength2 >= 0 || carry != 0) {
    			// 取字符串的字符减 字符0 即可得到对应数字
    			x = numlength1 < 0 ? 0 : num1.charAt(numlength1--)-'0';
    			y = numlength2 < 0 ? 0 : num2.charAt(numlength2--)-'0';
    			// 计算和
    			sum = x+y+carry;
    			// 添加到字符串尾部
    			resultstr.append(sum%10);
    			
    			/* 如果插入到s字符串的第一个位置,就不需要使用reverse()
    			 * s.insert(0, sum % 10);
    			 */
    			
    			// 更新进位
    			carry = sum/10;
    		}
    		return resultstr.reverse().toString();
    	}
    	public static void main(String[] args) {
    		String str1 = "123456789987654321", str2 = "147258369963852741";
    		String resultstr = stringAdd(str1, str2);
    		System.out.println(resultstr);
    
    	}
    }
    /* Code Running Results:
     * 270715159951507062
     */
    

    Java语言(使用递归):

    public class SuperLargeNumberAdditionTwo {
    	public static String stringAdd(String num1, String num2) {
    		return stringAddRecursion(num1, num1.length()-1, num2, num2.length()-1, 0);
    	}
    	public static String stringAddRecursion(String num1, int numlength1, String num2, int numlength2, int carry) {
    		// 参数:numlength1, numlength2 表示字符串 num1, num2 的长度. carry 代表进位
    		// 当 num1,num2 结束 并且不需要进位的时候返回空字符串
    		if(numlength1 < 0 && numlength2 < 0 && carry == 0)
    			return "";
    		// 取字符串的字符减 字符0 即可得到对应数字
    		carry += numlength1 < 0 ? 0 : num1.charAt(numlength1--)-'0';
    		carry += numlength2 < 0 ? 0 : num2.charAt(numlength2--)-'0';
    		int digit = carry%10;
    		// 更新进位
    		carry /= 10;
    		// 递归
    		String resultstr = stringAddRecursion(num1, numlength1, num2, numlength2, carry);
    		return resultstr + digit;
    	}
    	public static void main(String[] args) {
    		String str1 = "123456789987654321", str2 = "147258369963852741";
    		String resultstr = stringAdd(str1, str2);
    		System.out.println(resultstr);
    
    	}
    }
    /* Code Running Results:
     * 270715159951507062
     */
    
  • 相关阅读:
    统计一段文字中出现频率最高的10个单词(c语言)
    java之过滤器Filter (应用场景)
    java之过滤器Filter
    Spring AOP
    清华大学iCenter区块链公开课 第二节
    学习区块链 第一节 精通比特币
    使用Shiro登录成功后,跳转到之前访问的页面实现
    windows下系统移植到linux下出现的问题
    mysql分页查询
    安卓开发随笔
  • 原文地址:https://www.cnblogs.com/jiaohuadehulike/p/14295013.html
Copyright © 2020-2023  润新知