[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(