拼多多2018——大整数相乘

【题目】
有两个用字符串表示的非常大的大整数,算出他们的乘积,也是用字符串表示。不能用系统自带的大整数类型。
输入描述: 空格分隔的两个字符串,代表输入的两个大整数
输出描述: 输入的乘积,用字符串表示
示例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方法来进行读取。

猜你喜欢

转载自blog.csdn.net/weixin_39795049/article/details/88868536