2018校招真题在线编程-牛客网

本文介绍了一种处理两个大整数相乘的算法,该算法避免使用系统自带的大整数类型,通过字符串表示大整数,利用一维数组存储乘积的每一位,并通过双循环确定每一位的值,最后进行进位整理,去除末尾0,合成字符串并反转得到最终结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述
    有两个用字符串表示的非常大的大整数,算出他们的乘积,也是用字符串表示。不能用系统自带的大整数类型。


输入描述
    空格分隔的两个字符串,代表输入的两个大整数
输出描述
    输入的乘积,用字符串表示
示例1
    输入:72106547548473106236 982161082972751393
    输出:70820244829634538040848656466105986748


分析:将最终结果的每一位都存储到一个一维数组中,一维数组长度为m+n,m和n是两个字符串的长度,通过双循环将一维数组的每一位都确定(不考虑进位),最后通过遍历数组整理进位(保证每个元素小于10)去除末尾0,合成字符串反转并结束。


package com.nowcoder.schoolEnrollment2018;
import java.util.Scanner;
/**
 * @ClassName: PinDuoDuo2.java
 * @Description:有两个用字符串表示的非常大的大整数,算出他们的乘积,也是用字符串表示,不能用系统自带的大整数类型。
 * @author: Henray
 * @version:1.0
 * @Date: 2019年3月2日
 */
public class PinDuoDuo2 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String num1 = sc.next();
        String num2 = sc.next();
        System.out.println(Multiply(num1,num2));
    }

    public static String Multiply(String num1, String num2) {
        
        num1 = new StringBuilder(num1).reverse().toString();
        num2 = new StringBuilder(num2).reverse().toString();
        
        int[] d = new int[num1.length() + num2.length()];
        for (int i = 0; i < num1.length(); i++) {
            int a = num1.charAt(i) - '0';
            for (int j = 0; j < num2.length(); j++) {
                int b = num2.charAt(j) - '0';
                d[i + j] += a * b;
            }
        }
        
        StringBuilder builder = new StringBuilder();
        for (int i = 0; i < d.length; i++) {
            int digit = d[i] % 10;
            int carry = d[i] / 10;
            builder.insert(0, digit);
            if (i < d.length - 1)
                d[i + 1] += carry;
        }
        while (builder.length() > 0 && builder.charAt(0) == '0') {
            builder.deleteCharAt(0);
        }
        return builder.length() == 0 ? "0" : builder.toString();
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值