实现两个大数相乘

牛客网链接-大数相乘

思路:

  1. 内心知道这种方法是可以通过的,但是贼鸡儿麻烦。
  2. 输入两个字符串。按照笔算乘法的方式,循环计算。考虑到进位的问题。

代码:

package top.simuhunluo;

import java.util.Scanner;

public class Main {
    static StringBuffer[] results;
    static boolean z = true;
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        String a = scanner.next();
        String b = scanner.next();
        int a_len = a.length();
        int b_len = b.length();
        StringBuffer str_a = new StringBuffer(a);
        StringBuffer str_b = new StringBuffer(b);
        results = new StringBuffer[b_len];
        for (int i = b_len - 1, k = 0; i >= 0; i--, k++) {
            results[k] = new StringBuffer(a_len + b_len);
            int digit_b = str_b.charAt(i) - '0';
            int jinwei = 0;
            int yushu = 0;
            for (int j = a_len - 1; j >= 0; j--) {
                int digit_a = str_a.charAt(j) - '0';
                int temp = digit_a * digit_b + jinwei;
                jinwei = temp / 10;
                yushu = temp % 10;
                results[k].append(yushu);
            }
            results[k].append(jinwei);
        }
        for (int i = 0; i < results.length; i++) {
            for (int j = 0; j < i; j++) {
                results[i].insert(0, '0');
            }
            for (int j = 0; j < results.length - 1 - i; j++) {
                results[i].append('0');
            }
        }
        System.out.println(add(results));
    }

    public static StringBuffer add(StringBuffer[] results) {
        StringBuffer stringBuffer = new StringBuffer();
        int nums = results.length;//加数的个数
        int jinwei = 0;
        for (int i = 0; i < results[0].length(); i++) {
            int tmp = 0;
            for (int j = 0; j < nums; j++) {
                tmp = tmp + results[j].charAt(i) - '0';
            }
            tmp += jinwei;
            jinwei = tmp / 10;
            int yushu = tmp % 10;
            stringBuffer.append(yushu);
        }
        stringBuffer.append(jinwei);
        stringBuffer = stringBuffer.reverse();
        while (stringBuffer.charAt(0) == '0') stringBuffer.deleteCharAt(0);
        return stringBuffer;
    }
}

原文地址:https://www.cnblogs.com/simuhunluo/p/8620756.html

时间: 2024-10-31 00:20:43

实现两个大数相乘的相关文章

海豚实习-实现两个大数相乘

问题描述:定义大数d为一个数组,表示为:d=a[k-1]*10^(k-1)+a[k-2]*10^(k-2)+...+a[1]*10+a[0](k为数组长度),实现一个函数,返回两个大数相乘的结果 /** d1=a[k-1]*10^(k-1)+a[k-2]*10^(k-2)+...+a[1]*10+a[0] d2=b[l-1]*10^(l-1)+b[l-2]*10^(l-2)+...+b[1]*10+b[0] d1*d2 包含k*l项,这只是没有合并的 每一项可以表示为:d*10^x,然后将(x,

Go--实现两个大数相乘

----- import ( "bufio" "fmt" "os" "strings" ) func multi(str1, str2 string) (result string) { if len(str1) == 0 && len(str2) == 0 { result = "0" return } var index1 = len(str1) - 1 var index2 = len

1051:A &#215; B problem 大数相乘

给你两个整数,请你计算A × B. 输入 数据的第一行是整数T(1 ≤ T ≤ 20),代表测试数据的组数.接着有T组数据,每组数据只有一行,包括两个非负整数A和B.但A和B非常大,Redraiment能保证这些数用long来保存一定会溢出.但A和B的位数最大不会超过100位. 输出 对应每组测试数据,你都要输出两行:第一行为:"Case #:", # 代表这是第几组测试数据.第二行是一个等式:"A * B = Sum", Sum 代表 A × B 的结果.你要注意

两大数相乘 -- javascript 实现

(function(){ var multiply = function(n1,n2){ var nstr1 = n1.toString(); var nstr2 = n2.toString(); var carry = 0; var ret = ""; var di = 0; var dj = 0; var dig = 0.1; for(var i = nstr1.length - 1 ;i >= 0;i--) { var tmp = ""; var di

大数相乘

1.算法思路 将大数当做字符串进行处理,也就是将大数用十进制字符数组进行表示,然后模拟人们手工进行“竖式计算”的过程得到乘法的结果. 乘积是逐位相乘,也就是a[i] * b[j],结果加入到积C的第i+j位,即 最后处理进位即可 例如:A =17 = 1*10 + 7 = (7,1)最后是十进制的幂表示法,幂次是从低位到高位,以下同. B=25 = 2*10 + 5 = (5, 2); C = A * B = (7 * 5, 1 * 5 + 2 * 7, 1 * 2) = (35, 19, 2)

java版大数相乘

在搞ACM的时候遇到大数相乘的问题,在网上找了一下,看到了一个c++版本的 http://blog.csdn.net/jianzhibeihang/article/details/4948267 用java搞了一个版本 这里说一下思路 将数字已字符串形式接收,转换成int[]整型数组,然后num1[],num2[]依次相乘,结果保存到result[]中 其他注意的在注释中有说明 1 package com.gxf.test; 2 3 import java.util.Scanner; 4 5 p

大数相乘&mdash;&mdash;模拟乘法的运算规则

#define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<string.h> int main() { void add(int a[], int length1, int b[], int length2); char str1[255], str2[255]; int num1[255] = { 0 }, num2[255] = { 0 }; int product[255] = { 0 }, temp[255] =

大数相乘、相加、相减、相除

实现大数的加.减.乘.除运算 1 package com.bignumber.test; 2 3 /** 4 * 大数运算(+.-.*./) 5 * @author chen 6 * 7 */ 8 public class BigNumber { 9 10 public static void main(String[] args) { 11 12 String str1 = "123456789";//大数一 13 String str2 = "9876543210&quo

大数相乘算法C++版

#include <iostream> #include <cstring> using namespace std; #define null 0 #define MAXN 51 //大数相乘 char *big_cheng(char line1[], char line2[]) { short s1[MAXN], s2[MAXN], s[MAXN];//s1,s2:两个乘数:s:乘积的结果 int i, j, k, c; int len1, len2, len; len1 =