今日のアルゴリズム: 文字列の乗算

今日のアルゴリズム: 文字列の乗算

[[421393]]

この記事はWeChatの公開アカウント「3分でフロントエンドを学ぶ」から転載したもので、著者はsisterAnです。この記事を転載する場合は、「3分で学ぶフロントエンド」公式アカウントまでご連絡ください。

文字列として表される 2 つの非負整数 num1 と num2 を指定すると、文字列として表される num1 と num2 の積を返します。

例1:

  1. 入力: num1 = "2" 、num2 = "3"  
  2. 出力: "6"  

例2:

  1. 入力: num1 = "123" 、num2 = "456"  
  2. 出力: "56088"  

例:

  • num1 と num2 の長さが 110 未満です。
  • num1 と num2 には 0 ~ 9 の数字のみが含まれます。
  • num1 も num2 も、数字 0 自体でない限り、ゼロで始まることはありません。
  • 標準ライブラリの大きな数値型 (BigInteger など) を使用したり、入力を直接整数に変換して処理したりすることはできません。

解決策1: 従来の解決策

乗数を右から左に走査し、乗数の各桁に被乗数を掛けて対応する結果を取得し、各回で得られた結果を累積します。

さらに、乗数の各ビットを被乗数の上位ビット(最下位ビットではない)に掛ける場合、下位ビットを「0」で埋めることに注意してください。

  1. 乗算 =関数(num1, num2) {
  2. if (num1 === "0" || num2 === "0" )戻り値  「0」  
  3.      
  4. // 計算結果を保存するために使用されます
  5. res = "0"とします 
  6.          
  7. // num2 は num1 とビットごとに乗算されます
  8. (i = num2.length - 1; i >= 0; i --)の場合{  
  9. キャリーを0にする
  10. // num2 の i 番目の桁を num1 で乗算した結果を保存します
  11. temp = ''とします 
  12. // 0 で埋める
  13. (j = 0; j < num2.length - 1 - i; j++)の場合{
  14. 温度+= '0'  
  15. }
  16. n2 = num2.charAt(i) - '0'とします。  
  17.              
  18. // num2 の i 番目の桁 n2 を num1 で乗算します
  19. ( j = num1.length - 1 とします; j >= 0 || carry != 0; j --) {  
  20. n1 = j < 0 ? 0 とします: num1.charAt(j) - '0'  
  21. 積を(n1 * n2 + 繰り上がり) % 10とする
  22. 温度+= 製品
  23. キャリー = Math.floor((n1 * n2 + キャリー) / 10)
  24. }
  25. //現在の結果と新しく計算された結果を合計して新しい結果とする
  26. res = addStrings(res, Array.prototype.slice.call( temp ).reverse(). join ( "" ))
  27. }
  28. 戻り
  29. }
  30.  
  31. addStrings =関数(num1, num2) {
  32. a = num1.length、b = num2.length、結果 = '' 、tmp = 0とします。
  33. while(a || b) {
  34. a ? tmp += +num1[ --a] : ''  
  35. b ? tmp += +num2[ --b] : ''  
  36.          
  37. 結果 = tmp % 10 + 結果
  38. tmp > 9 の場合 tmp = 1
  39. それ以外の場合、 tmp = 0
  40. }
  41. if (tmp) 結果 = 1 + 結果
  42. 結果を返す
  43. }

複雑性分析:

  • 時間計算量: O(max(m*n, n*n))
  • 空間計算量: O(m+n)

解決策2: 垂直乗算(最適化)

2 つの数値 M と N を乗算した結果は、次の図に示すように、M に N の各桁の合計を乗算することによって得られます。

  • num1 と num2 の各桁を掛け合わせた合計を計算します。
  • 対応する位置に従ってすべての合計を加算して、num1 * num2の結果を取得します。
  1. 乗算 =関数(num1, num2) {
  2. if(num1 === '0' || num2 === '0' )戻り値  「0」  
  3.      
  4. // 計算結果を保存するために使用されます
  5. res = [] とします
  6.      
  7. // 一の位から桁ごとに掛け算を始める
  8. ( i = 0 とします; i < num1.length; i++){
  9. // num1 末尾要素
  10. tmp1 = +num1[num1.length-1-i]とします。
  11.          
  12. (j = 0; j < num2.length; j++)の場合{
  13. // num2 末尾の要素
  14. tmp2 = +num2[num2.length-1-j]とします。
  15.              
  16. // 結果セットのインデックス位置に値があるかどうかを判定します
  17. pos = res[i+j] ? res[i+j]+tmp1*tmp2 とします: tmp1*tmp2
  18. // 現在のインデックス位置に値を割り当てる
  19. res[i+j] = 位置%10
  20. // 持ち越すかどうか。これにより res が簡素化され、不要な"0"が削除されます。  
  21. pos >=10 && (res[i+j+1]=res[i+j+1] ? res[i+j+1]+Math.floor(pos/10) : Math.floor(pos/10));
  22. }
  23. }
  24. res.reverse() を返します。join ( " " ) ;
  25. }

複雑性分析:

  • 時間計算量: O(m * n)
  • 空間計算量: O(m + n)

<<:  [技術的な詳細] 自動化プラットフォームの将来はどうなるのでしょうか? IBM Cloud Pak for Business Automationのコンポーネントを詳しく見る

>>:  AI倫理の夜明け

推薦する

階乗関連のアルゴリズムとその C++ 実装

階乗とは、必要な数値が得られるまで 1 × 2 × 3 × 4 を掛け合わせることを意味します。 C...

デジタル変革の本質、道筋、段階、課題を1つの記事で解説

01エンタープライズデジタルトランスフォーメーションの本質デジタル化により、人間が暮らす現実世界と仮...

人工知能を導入できるいくつかのアプリケーション

人工知能は長年にわたって世界を支配しており、さまざまな分野における主要な問題が AI を使用して解決...

アマゾン、AIが女性の求職者に低い評価を与えたため研究チームを解散に追い込まれる

[[246043]]アマゾンの機械学習チームは2014年以来、優秀な人材の求職活動をよりスマートにす...

小売業界におけるAIインテリジェントビデオ分析の応用

人工知能 (AI) は、情報の集合からビジネス価値のある洞察を抽出することを目的とするデータ サイエ...

避けるべきビジネス インテリジェンス実装の悪い例トップ 10

ビジネス インテリジェンスは、あらゆる業界のグローバル企業の従来のワークロードを変革しています。ビジ...

...

...

人工知能がクラウド業界を変える5つの方法

2023年には人工知能が最も重要な技術トレンドになることは間違いありません。 AI テクノロジーは新...

顔認識の時代の準備はできていますか?

[51CTO.comからのオリジナル記事] 近年、生体認証技術はますます成熟し、私たちの生活の中に...

DeepMind: 人工知能と神経科学を組み合わせて好循環を実現

最近の人工知能の進歩は目覚ましいものがあります。人工システムは、アタリのビデオゲーム、古代のボードゲ...

...

スタートアップに適した AI ビジネス モデルを選択するにはどうすればよいでしょうか?

[[406810]] [51CTO.com クイック翻訳]人工知能技術は企業が行うビジネスにとって...

人工知能に対するいくつかの態度: 流行を追跡するために個人データを犠牲にする用意がありますか?

最近、AI に関する調査、研究、予測、その他の定量的評価が相次いで発表され、世界中の企業による AI...