大整数减法

3:大整数减法

总时间限制: 

1000ms

内存限制: 

65536kB

描述

求两个大的正整数相减的差。

输入

共2行,第1行是被减数a,第2行是减数b(a > b)。每个大整数不超过200位,不会有多余的前导零。

输出

一行,即所求的差。

样例输入

9999999999999999999999999999999999999
9999999999999

样例输出

9999999999999999999999990000000000000

 

 












import java.util.Scanner;

public class Sub {

	public static void main(String[] args) {
		Scanner n1=new Scanner(System.in);
		String num1=n1.next();
		String num2=n1.next();
		if(sub(num1,num2).length()==0)
			System.out.println("0");
		else System.out.println(sub(num1,num2));
	}
    
	public static String reverseString(String num) {
		return new StringBuffer(num).reverse().toString();
	}
	
	public static int charToInt(char a) {
		int b=(int)a-(int)'0';
		return b;
	}
	
	public static String deleteZero(String res) {
		char arry[]=res.toCharArray();

		int len=res.length();
		String newstr="";
		for(int i=0;i<len;i++) {
			if(arry[i]=='0')
				continue;
			else {
				newstr=res.substring(i,len);
				break;
			}
		}
		return newstr;
	}
	
	//num1是被减数,num2是减数
	public static String sub(String num1,String num2) {
		//将两个减数反转
		num1=reverseString(num1);
		num2=reverseString(num2);
		//res表示结果,储存最终的相减之后的结果,是StringBuilder类
		StringBuilder res=new StringBuilder();
		//carry表示借位,carry只有两个值,0或者-1
		int carry=0;
		//N1是被减数的长度,N2是减数的长度,由于被减数大于减数,所以N1>=N2
		int N1=num1.length();
		int N2=num2.length();
		//i用于记录相减进行的位置
		int i=0;
		//公共部分的相减
		for(;i<N2;i++) {
			//i2和i1分别表示num2和num1的两个字符串进行相减操作位置上字符转化成整型后的值
			int i2=charToInt(num2.charAt(i));
			int i1;
			if(i<N1) {
				i1=charToInt(num1.charAt(i));
			}
			else i1=0;
			//r表示一位相减后的结果加上借位的情况,r<0需要向后一位借一位,进行相减操作
			int r=i1-i2+carry;
			if(r<0) {
				//carry=-1,出现借位
				carry=-1;
				//借完位之后的结果
				r=r+10;
			}
			//carry=0,不需要向后一位借位
			else carry=0;
			//将一位相减的结果添加到最终结果的字符串上
			res.append(r);
		}
		//对于num1的长度大于num2的长度的情况中较长字符串比较短的字符串多出的位数的处理,直接考虑该位上的值和前一位借位值的和
		for(i=N2;i<N1;i++) {
			int i1=charToInt(num1.charAt(i));
			int r=i1+carry;
			if(r<0) {
				carry=-1;
				r=r+10;
			}
			else carry=0;
			res.append(r);
		}
		return deleteZero(res.reverse().toString());
	}
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值