博客
关于我
牛客网-大数相乘
阅读量: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/

    你可能感兴趣的文章
    mysql 不区分大小写
    查看>>
    mysql 两列互转
    查看>>
    MySQL 中开启二进制日志(Binlog)
    查看>>
    MySQL 中文问题
    查看>>
    MySQL 中日志的面试题总结
    查看>>
    mysql 中的all,5分钟了解MySQL5.7中union all用法的黑科技
    查看>>
    MySQL 中的外键检查设置:SET FOREIGN_KEY_CHECKS = 1
    查看>>
    Mysql 中的日期时间字符串查询
    查看>>
    mysql 中索引的问题
    查看>>
    MySQL 中锁的面试题总结
    查看>>
    MySQL 中随机抽样:order by rand limit 的替代方案
    查看>>
    MySQL 为什么需要两阶段提交?
    查看>>
    mysql 为某个字段的值加前缀、去掉前缀
    查看>>
    mysql 主从
    查看>>
    mysql 主从 lock_mysql 主从同步权限mysql 行锁的实现
    查看>>
    mysql 主从互备份_mysql互为主从实战设置详解及自动化备份(Centos7.2)
    查看>>
    mysql 主从关系切换
    查看>>
    MYSQL 主从同步文档的大坑
    查看>>
    mysql 主键重复则覆盖_数据库主键不能重复
    查看>>
    Mysql 事务知识点与优化建议
    查看>>