【题目】
有两个用字符串表示的非常大的大整数,算出他们的乘积,也是用字符串表示。不能用系统自带的大整数类型。
输入描述: 空格分隔的两个字符串,代表输入的两个大整数
输出描述: 输入的乘积,用字符串表示
示例1
输入 72106547548473106236 982161082972751393
输出 70820244829634538040848656466105986748
package nian2018;
import java.util.*;
import java.io.*;
/*
* 有两个用字符串表示的非常大的大整数,算出他们的乘积,也是用字符串表示。不能用系统自带的大整数类型。
*/
public class Main2 {
public String mul(String num1,String num2){
int[] nums1 = new int[num1.length()],nums2=new int[num2.length()],res=new int[num1.length()+num2.length()];
for(int i =num1.length()-1; i >=0;i --){//nums1 为把num1倒着放进来
nums1[i] = num1.charAt(num1.length()-1-i)-'0';
}
for(int i =num2.length()-1; i >=0;i --){
nums2[i] = num2.charAt(num2.length()-1-i)-'0'; //把char转换成int数组,减去0的ascii码得到的就是实际的数字
}
for(int i =0; i < num1.length(); i++){
for(int j = 0;j <num2.length();j++){
res[i+j] += nums1[i]*nums2[j];
}
}
//进位和留位
for(int i =1;i<res.length;i++){
//进位
res[i] += res[i-1]/10;
//留位
res[i-1] = res[i-1]%10;
}
StringBuffer buffer = new StringBuffer();
boolean start = false;
for(int i =res.length-1; i >=0; i--){
if (!start &&res[i] == 0) continue;
else start = true;
buffer.append(res[i]);
}
return buffer.toString();
}
public static void main(String[] args) throws IOException{
Main2 c = new Main2();
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
String input = bf.readLine();
String[] inputs = input.split(" ");
String res = c.mul(inputs[0],inputs[1]);
System.out.println(res);
}
}
ps:
【1】num1
nums1
【2】Nums2同理
【3】res
【4】
参考:
1.https://blog.csdn.net/lzh_86/article/details/78107597
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
(1)System.in的类型可以归结为节点流、字节流、输入流;是个字节流
(2)InputStreamReader这个对象是处理流,字符流,输入流;是字节流通向字符流的桥梁,是字符流和字节流之间的转换中介
(3)BufferedReader的类型是缓冲处理流、字符流、输入流。字符流
例如:
每次调用 InputStreamReader 中的一个 read() 方法都会导致从底层输入流读取一个或多个字节。要启用从字节到字符的有效转换,可以提前从底层流读取更多的字节,使其超过满足当前读取操作所需的字节。 为了达到最高效率,可要考虑在 BufferedReader 内包装 InputStreamReader。例如: BufferedReader in= new BufferedReader(new InputStreamReader(System.in));
整体意思就是用InputStreamReader这个中介把System.in这个字节流转换成字符流BufferedReader这样输入的时候就可以不是一个一个字节读,而是一个一个字符读,再加上是个Buffer,效率会高很多。
InputStream is = System.in;//键盘输入流
InputStreamReader isr = new InputStreamReader(is);//字节流转换为字符流
BufferedReader bufr = new BufferedReader(isr);//把字符流添加到缓冲流
用户通过reader对象的readLine方法来进行读取。