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());
}
}