博客
关于我
牛客网-大数相乘
阅读量:208 次
发布时间:2019-02-28

本文共 1942 字,大约阅读时间需要 6 分钟。

为了将两个非常大的大整数用字符串表示相乘并返回结果,我们可以使用字符串模拟大整数相乘的方法。这种方法避免了直接处理大整数可能带来的性能问题,并且适用于非常大的数字。

方法思路

  • 初始化结果数组:创建一个足够大的数组来保存乘积的每一位。数组的长度等于两个输入字符串的长度之和。
  • 双重循环处理每一位:从右到左处理每一位,先处理较大的数的每一位,然后再处理较小的数的每一位。每次处理两个数字相乘,并加上从低位传来的进位。
  • 处理进位:在每一步计算乘积后,检查是否需要进位。如果有进位,则将其保存到更高的位上。
  • 处理剩余进位:在双重循环完成后,可能还有进位需要处理。继续处理这些进位,直到没有进位为止。
  • 解决代码

    import java.util.Scanner;public class Main {    public static void main(String[] args) {        Scanner scanner = new Scanner(System.in);        String input = scanner.nextLine().trim();        String[] numStrings = input.split(" ");        String a = numStrings[0];        String b = numStrings[1];        int m = a.length();        int n = b.length();        int[] result = new int[m + n];        int carry = 0;        for (int i = m - 1; i >= 0; i--) {            for (int j = n - 1; j >= 0; j--) {                int x = a.charAt(i) - '0';                int y = b.charAt(j) - '0';                int sum = x * y + carry;                result[i + j] = sum % 10;                carry = sum / 10;            }        }        // 处理剩余的进位        int i = 0;        int j = 0;        while (carry > 0) {            int sum = carry;            if (i + j < m + n) {                result[i + j] = sum % 10;                carry = sum / 10;            } else {                break;            }            i++;            j++;        }        // 构建结果字符串        StringBuilder sb = new StringBuilder();        for (int k = 0; k < m + n; k++) {            sb.append(result[k]);        }        // 去掉前导零        int start = 0;        while (start < m + n && sb.charAt(start) == '0') {            start++;        }        if (start == m + n) {            System.out.println("0");        } else {            System.out.println(sb.substring(start));        }    }}

    代码解释

  • 读取输入:使用Scanner读取输入字符串,并将其拆分为两个数字字符串。
  • 初始化结果数组:创建一个足够长的数组来保存乘积结果。
  • 双重循环处理每一位:从右到左处理每一位,计算乘积并处理进位。
  • 处理剩余进位:在双重循环完成后,继续处理剩余的进位。
  • 构建结果字符串:将结果数组转换为字符串,并去掉前导零。
  • 这种方法确保了我们能够处理非常大的数字,并正确地返回它们的乘积。

    转载地址:http://tsvj.baihongyu.com/

    你可能感兴趣的文章
    noi 7827 质数的和与积
    查看>>
    NOI-1.3-11-计算浮点数相除的余数
    查看>>
    NOI2010 海拔(平面图最大流)
    查看>>
    NOIp2005 过河
    查看>>
    NOIP2011T1 数字反转
    查看>>
    NOIP2014 提高组 Day2——寻找道路
    查看>>
    noip借教室 题解
    查看>>
    NOIP模拟测试19
    查看>>
    NOIp模拟赛二十九
    查看>>
    Vue3+element plus+sortablejs实现table列表拖拽
    查看>>
    Nokia5233手机和我装的几个symbian V5手机软件
    查看>>
    Non-final field ‘code‘ in enum StateEnum‘
    查看>>
    none 和 host 网络的适用场景 - 每天5分钟玩转 Docker 容器技术(31)
    查看>>
    None还可以是函数定义可选参数的一个默认值,设置成默认值时实参在调用该函数时可以不输入与None绑定的元素...
    查看>>
    NoNodeAvailableException None of the configured nodes are available异常
    查看>>
    Vue.js 学习总结(16)—— 为什么 :deep、/deep/、>>> 样式能穿透到子组件
    查看>>
    NOPI读取Excel
    查看>>
    NoSQL&MongoDB
    查看>>
    NoSQL介绍
    查看>>
    Notadd —— 基于 nest.js 的微服务开发框架
    查看>>