博客
关于我
牛客网-大数相乘
阅读量: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 5.0-触发器(参考)_mysql
    查看>>
    MySQL及navicat for mysql中文乱码
    查看>>
    MySqL双机热备份(二)--MysqL主-主复制实现
    查看>>
    MySQL各个版本区别及问题总结
    查看>>
    MySql各种查询
    查看>>
    mysql同主机下 复制一个数据库所有文件到另一个数据库
    查看>>
    mysql启动以后会自动关闭_驾照虽然是C1,一直是开自动挡的车,会不会以后就不会开手动了?...
    查看>>
    mysql启动和关闭外键约束的方法(FOREIGN_KEY_CHECKS)
    查看>>
    Mysql启动失败解决过程
    查看>>
    MySQL启动失败:Can't start server: Bind on TCP/IP port
    查看>>
    mysql启动报错
    查看>>
    mysql启动报错The server quit without updating PID file几种解决办法
    查看>>
    MySQL命令行登陆,远程登陆MySQL
    查看>>
    mysql命令:set sql_log_bin=on/off
    查看>>
    mySQL和Hive的区别
    查看>>
    MySQL和Java数据类型对应
    查看>>
    mysql和oorcale日期区间查询【含左右区间问题】
    查看>>
    MySQL和SQL入门
    查看>>
    mysql在centos下用命令批量导入报错_Variable ‘character_set_client‘ can‘t be set to the value of ‘---linux工作笔记042
    查看>>