大数相加,大数相减



public class 大数相加 {
	public static String add(String n1, String n2){  
        StringBuilder result = new StringBuilder();  
          
        // 反转字符串  
        String rn1 = new StringBuilder(n1).reverse().toString();  
        String rn2 = new StringBuilder(n2).reverse().toString(); 
          
        int len1 = rn1.length();  
        int len2 = rn2.length();  
          
        int maxLen = len1 > len2 ? len1 : len2;  
          
        boolean nOverFlow = false;// 是否越界  
        int nTakeOver = 0;// 溢出数量  
          
        // 把两个字符串补齐,即短字符串的高位用0补齐  
        if(len1 < len2){  
            for(int i = len1; i < len2; i++){  
                rn1 += "0";  
            }  
        }else{  
            for(int i = len2; i < len1; i++){  
                rn2 += "0";  
            }  
        }  
          
        // 把两个正整数相加,一位一位的加 并加上进位  
        for(int i = 0; i < maxLen; i++){  
            int nSum = (rn1.charAt(i)-'0') + (rn2.charAt(i)-'0');  
            nSum = nSum + nTakeOver;// 加上前一位的进位  
              
            if(nSum >= 10){  
                if(i == maxLen - 1){// 已经计算到最后一位了  
                    nOverFlow = true;  
                }  
                  
                nTakeOver = 1;//溢出了  
                result.append(nSum - 10);  
            }else{  
                nTakeOver = 0;// 没溢出  
                result.append(nSum);  
            }  
        }  
          
        // 如果溢出的话 表示位增加了  
        if(nOverFlow){  
            result.append(nTakeOver);  
        }  
          
        return result.reverse().toString();  
    }  
	
		public static String reduce(String str1,String str2){
		StringBuilder sb=new StringBuilder();
		if(str1==null ||str2==null){
			return sb.toString();
		}
		String s1=new StringBuilder(str1).reverse().toString();
		String s2=new StringBuilder(str2).reverse().toString();
		int len1=s1.length();
		int len2=s2.length();
		int max=len1>len2?len1:len2;
		if(len1>len2){
			for(int i=len2;i<max;i++){
				s2+="0";
			}
		}else{
			for(int i=len1;i<max;i++){
				s1+="0";
			}
		}
		int over=0;
		for(int i=0;i<max;i++){
			int sum=0;
			if(len1>len2){
				 sum=s1.charAt(i)-'0'-(s2.charAt(i)-'0');
				sum+=over;
			}else{
				sum=s2.charAt(i)-'0'-(s1.charAt(i)-'0');
				sum+=over;
			}
			if(sum<0){
				over=-1;
				sb.append(10+sum);
			}else{
				over=0;
				sb.append(sum);
			}
		}
		return sb.reverse().toString();
	}
	
    public static void main(String[] args){  
        String n1 = "999999999";  
        String n2 = "9999999999";  
        System.out.println(add(n1, n2));
        System.out.println(reduce(n1, n2));
    }  

}

 

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值