1. 程式人生 > >[LeetCode]43 高精度乘法

[LeetCode]43 高精度乘法

Multiply Strings(高精度乘法)

【難度:Medium】
Given two numbers represented as strings, return multiplication of the numbers as a string.

Note: The numbers can be arbitrarily large and are non-negative.
實現高精度非負整數乘法。

解題思路

按照常規解法,用字串操作來模擬乘法的步驟可以先實現字串高精度加法,再將加法運用到乘法過程中。這種方法簡單但是耗時比較大,這裡介紹一種比較巧妙的方法,借鑑LeetCode上的一份高票程式碼。
這裡寫圖片描述


觀看上圖,它描述的是我們計算乘法的過程。仔細分析可以發現,對於原來在上面字串中下標為1的“2”和在下面字串中下標為0的“4”的相乘結果08出現在了最後的乘法結果字串的下標1和2處。這一結果對其他下標的數字同樣成立:下標i和下標j相乘的高位結果位於下標i+j處,低位位於下標i+j+1處。根據這個結果,實現高精度的乘法就變得簡單了。

c++程式碼如下:

//高票程式碼版本
class Solution {
public:
    string multiply(string num1, string num2) {
        int m = num1.size();
        int
n = num2.size(); vector<int> array(m+n); string ans = ""; for (int i = m-1; i >= 0; i--) { for (int j = n-1; j >= 0; j--) { int index1 = i + j; int index2 = i + j + 1; int sum = (num1[i]-'0')*(num2[j]-'0')+array
[index2]; array[index1] += sum / 10; array[index2] = sum % 10; } } for (auto v:array) { if (ans.size() != 0 || v != 0) ans += to_string(v); } return ans.size() == 0?"0":ans; } };
//簡單但低效版本
class Solution {
public:
    string multiply(string num1, string num2) {
        if(num1.empty())
            return num2;
        if (num2.empty())
            return num1;
        if (num1.size() == 1 && num1[0] == '0')
            return "0";
        if (num2.size() == 1 && num2[0] == '0')
            return "0";

        string ans = "";
        int count = -1;
        for (int i = num1.size()-1;i >= 0; i--) {
            string tmp = "";
            int carry = 0;
            count++;
            for (int j = num2.size()-1; j >= 0; j--) {
                int m = (num1[i]-'0')*(num2[j]-'0')+carry;
                carry = m / 10;
                tmp = to_string(m%10)+tmp;
            }
            if (carry)
                tmp = to_string(carry)+tmp;
            int count_tmp = count;
            while (count_tmp) {
                tmp = tmp + "0";
                count_tmp--;
            }

            ans = add(ans,tmp);
        }
        return ans;
    }
    string add(string num1, string num2) {
        if(num1.empty())
            return num2;
        if (num2.empty())
            return num1;

        int carry = 0;
        int i = num1.size()-1;
        int j = num2.size()-1;
        string ans = "";

        while (i >= 0 && j >= 0) {
            int m = (num1[i]-'0')+(num2[j]-'0')+carry;
            carry = m / 10;
            ans = to_string(m%10) + ans;
            i--;
            j--;
        }
        while (i >= 0) {
            int m = (num1[i]-'0')+carry;
            carry = m / 10;
            ans = to_string(m%10) + ans;
            i--;
        }
        while (j >= 0) {
            int m = (num2[j]-'0')+carry;
            carry = m / 10;
            ans = to_string(m%10) + ans;
            j--;
        }
        if (carry)
            ans = to_string(carry)+ans;
        return ans;
    }
};

相關推薦

[LeetCode]43 精度乘法

Multiply Strings(高精度乘法) 【難度:Medium】 Given two numbers represented as strings, return multiplication of the numbers as a string.

精度乘法加強

turn con amp i++ post har star lib ets 轉自http://blog.csdn.net/cm_yali/article/details/50607751 #include<stdio.h> #include&

精度乘法

我們 末尾 pre family break 存儲 har div 大數 計算大數間的乘法,原理來源我們的乘法筆算 1 2 3 * 5 6 7 *--------------------------

洛谷 P1303 A*B Problem(精度乘法) 題解

正文 題目 names printf 精度 bool return max org 此文為博主原創題解,轉載時請通知博主,並把原文鏈接放在正文醒目位置。 題目鏈接 :https://www.luogu.org/problem/show?pid=1303 題目描述

精度乘法】NOIP2003麥森數

bottom clas map 復制 題目 radi 最大的 bit while 題目描述 形如2^{P}-12P?1的素數稱為麥森數,這時PP一定也是個素數。但反過來不一定,即如果PP是個素數,2^{P}-12P?1不一定也是素數。到1998年底,人們已找到了37個麥森數

數論-FFT精度乘法

turn 輸入 str name clas ret lag BE 題目 NKOJ3071 模板題:求兩個整數之積. FFT 函數裏 ty = 1 表示 DFT 運算,ty = -1 表示 IDFT 運算. 1 #include <stdio.h>

精度精度乘法

con img sub alt 狀態 圖片 hide num mst 問題 J: 【高精度】高精度乘法 時間限制: 1 Sec 內存限制: 64 MB提交: 286 解決: 94[提交] [狀態] [討論版] [命題人:] 題目描述 牢門上的第三道鎖,需要使用高精度乘

HDU1402 FFT精度乘法模板題

#include<bits/stdc++.h> using namespace std; //HDU 1402 求高精度乘法 const double PI = acos(-1.0); //複數結構體 struct Complex { double x,y;//實部和虛

精度乘法-CodeVS

今天做了一下高精度的乘法,發現沒有什麼思路,上網找了一下別人的程式碼和思路,自己實現了一下,在CodeVS上測試通過了。讓我來好好學學這個思路把。先把程式碼貼上來先:  #include <iostream> #include <stdio.h> #incl

精度乘法 JAVA 和 C++ 版本

本文采用JAVA和C++手動計算大數乘法。 這是是個常見、標準的乘法演算法。簡單易懂,可以多次看記下來。 C++ #include <iostream> #include <vector> #include <string> using n

精度乘法精乘精)(C語言實現)

原始碼&註釋 #include <stdio.h> #include <string.h> char s[10000],ss[10000]; int a[10000],b[10000],c[10000]; int len,l

[模板]精度乘法

FFT優化多項式乘法。 #include <iostream> #include <cstdio> #include <cstring> #include <cmath> #include <cstring> using names

SJTUOJ 1015. 精度乘法

問題內容 Description 輸入2個整數a和b,輸出a*b。 Input Format 輸入有兩行,第一行a,第二行b。 0≤a,b≤21000。 Output Format 輸出只有一行,a*b。 Sample Input 44 3 Sample Output 1

C++ 精度乘法

題目描述: 給定兩個位數不超過100位的正整數,求它們的乘積。 輸入描述: 輸入檔案中包含多個測試數據。每個測試數據佔兩行,分別為一個正整數, 每個正整數的位數不超過100位。輸入數據一直到檔案尾。 輸出描述: 對輸入文件中的每個測試數據,輸出其中兩個正整數的乘積。 樣例

FFT實現精度乘法

你應該知道$FFT$是用來處理多項式乘法的吧。 那麼高精度乘法和多項式乘法有什麼關係呢? 觀察這樣一個$20$位高精度整數$11111111111111111111$ 我們可以把它處理成這樣的形式:$\sum_{i=0}^{19}1\times10^i$ 這樣就變成了一個多項式了! 直接上程式碼吧(

LeetCode總結 -- 精度

我們常見的一些基本的資料結構比如整型int或者浮點型float由於位數過多無法用內建型別儲存,這時候我們就需要自己實現高精度的資料型別來進行儲存和運算。這種問題在實際產品中還是比較實用的,所以相對來說也是面試中的常客。LeetCode中關於高精度的題目有以下幾道:Add Bi

ADV-206 不大的數(精度乘法)

問題描述   在當今的大資料時代,超大數的高精度計算已經成為眾多領域的熱門研究之一。現在T校也想在此領域有所造詣已造福於全社會,然而由於時間有限,所以短時間內難以找出大數計算的通用演算法,於是學校找到了同學中的“神霸”——你來幫忙,並僅要求你能在數並不算大的時候給出結果

C++實現精度乘法

由於計算機的儲存位元組有限,所以不能完整表示一個很大整數的精確值,這時候就得用到其他的方法,稱之為高精度演算法。這裡,主要說下高精度乘法。高精度乘法,實際上,就是模擬乘法的過程。像小學的筆算過程。

精度乘法,大數相乘

//之前寫過盜版(高精度乘法),今天寫一下類似正版的吧。 //本文章分成C++和C語言版,以後決定只用C語言學演算法了,感覺這樣對C語言會有更深的瞭解,用到實際公司程式時再用C++和java //第一個比較容易理解,輸入字串給整型陣列,再對乘法計算規則有點了解即可,基本是打

精度乘法模板

高精度乘法 模板 1.char 類 void High_Char(char a[], char b[]) { int num[500]; memset(num, 0, sizeof(