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

    你可能感兴趣的文章
    poj3045 Cow Acrobats(二分最大化最小值)
    查看>>
    poj3061 Subsequence(尺取法)
    查看>>
    poj3074 DLX精确覆盖
    查看>>
    poj3252(组合数)
    查看>>
    Qt笔记——QToolBox开发简易QQ聊天界面
    查看>>
    poj3307
    查看>>
    Qt笔记——QString与隐式共享、MVC架构
    查看>>
    Qt笔记——QSemaphore处理生产者/消费者模式
    查看>>
    Qt笔记——QMutex&QWaitCondition处理生产者消费者模式
    查看>>
    Qt笔记——QLable+QPixmap图片缩放踩坑
    查看>>
    Qt笔记——foreach与forever
    查看>>
    QT程序怎么挪到Linux下,linux+Qt程序如何打包发布
    查看>>
    Qt知识:视图框架QGraphicsWidget详解
    查看>>
    SpringBoot中项目启动及定时任务缓存数据库常用数据至内存变量并转换后高频调用
    查看>>
    Qt知识: 画刷风格
    查看>>
    QT的OpenGL渲染窗QOpenGLWidget Class
    查看>>
    QT的C++程序加载动态链接库DLL(Linux下是so)的方式
    查看>>
    QT界面操作1:如何跟踪鼠标位置?
    查看>>
    Qt环境搭建(Visual Studio)
    查看>>
    QT点击"X"按钮,调用closeEvent()函数来实现调用特定事件(附:粗略介绍QT的信号与槽的使用方法)...
    查看>>