1. 12 * 34 = 408
  2. 123 * 456 = 56088
  3. 0 * 12345 = 0
  4. 999 * 999 = 998001
  5. 2 * 3 = 6
  6. 10 * 10 = 100
  7. 100 * 0 = 0
コース一覧
コンピューターサイエンス:アルゴリズム / OS / ネットワーク / DB
大きな数の文字列乗算

コンピューターサイエンス:アルゴリズム / OS / ネットワーク / DB

ソート、探索、再帰などのアルゴリズムに加え、OS (プロセス、メモリ、ファイルシステム)、ネットワーク (TCP/IP、HTTP、DNS、CDN)、データベースまで、Web エンジニアに必要な CS の基礎を一本で学べる総合コースです。エンジニア転職を目指す学習者や、CS 出身でない現役エンジニアを対象としています。約 34 時間 (1 日 30 分 × 68 日) で 135 レッスンを修了でき、修了後は技術選定やシステム設計の議論に自信を持って参加できるようになります。

1
再帰の基礎
01. 階乗(再帰)5分
02. フィボナッチ数(再帰)5分
03. 累乗(再帰)5分
04. 配列の合計(再帰)5分
05. 桁数を数える(再帰)5分
06. 文字列を逆順(再帰)5分
07. ユークリッドの互除法(GCD)5分
08. 第1章まとめクイズ — 再帰の基礎5分
2
第2章 探索
01. 線形探索で位置を返す5分
02. 二分探索 (反復版)5分
03. 二分探索 (再帰版)5分
04. lower_bound (最初に >= target の位置)5分
05. ピーク要素検索5分
06. 回転ソート配列での探索5分
07. 第2章まとめクイズ5分
3
ソート
01. バブルソート実装5分
02. 選択ソート5分
03. 挿入ソート5分
04. マージソート5分
05. クイックソート5分
06. カウントソート5分
07. 比較関数つきソート5分
08. 第3章まとめクイズ5分
4
配列 / 文字列の応用
01. 双方向ポインタで和 = K5分
02. スライド窓の最大和5分
03. 回文判定5分
04. 重複なし最長部分文字列5分
05. 大きな数の文字列乗算5分
06. アナグラムグルーピング5分
07. 第4章まとめクイズ — 配列 / 文字列の応用5分
5
クラスと OOP
01. 長方形クラス(面積と周長)5分
02. スタッククラス(push と pop)5分
03. キュークラス(enqueue と dequeue)5分
04. 単方向リンクリスト5分
05. 二分探索木 (BST) への挿入5分
06. カウンタクラス(機能合成)5分
07. 第 5 章クイズ — クラスと OOP5分
6
動的計画法 (基礎)
01. メモ化フィボナッチ5分
02. DP配列でフィボナッチ5分
03. 階段の登り方5分
04. コイン両替最小枚数5分
05. 0/1 ナップサック問題5分
06. 最長共通部分列 (LCS)5分
07. 第6章まとめクイズ5分
7
総合演習
01. ソート済み 2 配列のマージ5分
02. 配列の k 回転5分
03. カッコの妥当性5分
04. ローマ数字を整数に5分
05. 整数をローマ数字に5分
06. 雨水を溜める5分
07. 最終総まとめクイズ5分
8
[OS] Section 1. OS とは
01. コンピューターとOSの役割15分
02. OSの歴史(バッチ→マルチタスク→マルチユーザー)15分
03. カーネルとユーザーランド15分
04. システムコールの仕組み15分
05. Linux / macOS / Windows のアーキ比較15分
9
[OS] Section 2. プロセスとスレッド
01. プロセスとは15分
02. スレッドとプロセスの違い15分
03. コンテキストスイッチ15分
04. スケジューラとアルゴリズム15分
05. プロセス間通信(IPC)15分
10
[OS] Section 3. メモリ管理
01. メモリ階層(レジスタ→キャッシュ→RAM→ディスク)15分
02. 仮想メモリ15分
03. ページングとスワップ15分
04. mmap とメモリマップトファイル15分
05. ガベージコレクション概要15分
11
[OS] Section 4. ファイルシステム
01. ファイルシステムとは15分
02. i-node とディレクトリ15分
03. ext4 / APFS / NTFS の違い15分
04. ジャーナリングと耐障害性15分
05. パーミッションと所有者15分
12
[OS] Section 5. 同期と並行性
01. レースコンディション15分
02. Mutex と Semaphore15分
03. デッドロック15分
04. 非同期と並行15分
05. イベントループと epoll15分
13
[ネットワーク] ネットワークの全体像
01. ネットワークとは8分
02. OSI 7階層モデル10分
03. TCP/IP 4階層モデル9分
04. パケットとフレーム9分
05. ルーター・スイッチ・ハブ9分
14
[ネットワーク] IP とルーティング
01. IPアドレス (IPv4 / IPv6)10分
02. サブネットマスクと CIDR11分
03. NAT とプライベートIP9分
04. ルーティングと経路選択10分
05. ファイアウォール基礎9分
15
[ネットワーク] TCP / UDP
01. TCP と UDP の違い9分
02. 3-way ハンドシェイク9分
03. 輻輳制御と再送10分
04. UDP の用途 (DNS / 動画 / ゲーム)8分
05. ポート番号と well-known port9分
16
[ネットワーク] HTTP / HTTPS
01. HTTP の基本10分
02. HTTP メソッド9分
03. HTTPS と TLS ハンドシェイク10分
04. HTTP/2 と HTTP/3 (QUIC)10分
05. REST API の設計原則10分
17
[ネットワーク] DNS とドメイン
01. DNS とは8分
02. レコードタイプ10分
03. 名前解決の流れ10分
04. DNS キャッシュと TTL9分
05. CDN の仕組みと Anycast10分
18
[ネットワーク] 応用
01. ロードバランサ (L4 / L7)10分
02. プロキシとリバースプロキシ9分
03. WebSocket とリアルタイム通信9分
04. gRPC と HTTP/2 利用10分
19
[データベース] データベースの基礎
01. データベースとは8分
02. RDB と NoSQL の違い8分
03. データベースの歴史8分
04. エンティティ関係モデル (ER)8分
05. 主キー・外部キー・候補キー8分
20
[データベース] 正規化
01. 正規化とは何か8分
02. 第1正規形8分
03. 第2正規形8分
04. 第3正規形8分
05. 非正規化のトレードオフ8分
21
[データベース] インデックスと B-tree
01. インデックスの役割8分
02. B-tree の仕組み8分
03. B+tree(実際の DB 実装)8分
04. ハッシュインデックス8分
05. カバリングインデックス8分
22
[データベース] トランザクションと ACID
01. トランザクションとは8分
02. ACID 特性8分
03. 分離レベル8分
04. MVCC(マルチバージョン同時実行制御)8分
05. デッドロックと回避8分
23
[データベース] クエリ最適化
01. クエリプランナの役割8分
02. EXPLAIN の読み方8分
03. Nested Loop / Hash / Merge Join8分
04. インデックスチューニング8分
05. 統計情報とカーディナリティ8分
24
[データベース] スケーリング
01. レプリケーション8分
02. シャーディング8分
03. CAP 定理8分
04. 結果整合性8分
05. NewSQL と分散 SQL8分

大きな数の文字列乗算

桁が増えた瞬間に、答えが静かに変わる

言語が用意している整数には上限があります。JavaScript の Number は、ある大きさを超えると 1 を足しても増えません。

JavaScript

console.log(9007199254740992 + 1); // 9007199254740992

例外は出ません。黙って間違った値を返します。金額や識別子の計算でこれが起きると、原因を突き止めるまでにかなり時間を溶かします。上限を超える大きさを扱うなら、数として持つのをやめて、文字列のまま桁ごとに計算します。

どのマスに入るかは、掛けた 2 桁の位置で決まる

小学校の筆算をそのままなぞります。23 × 14 を、位ごとに分けて書き出します。

  • 3 × 4 = 12 — 一の位へ
  • 3 × 1 = 3 — 十の位へ
  • 2 × 4 = 8 — 十の位へ
  • 2 × 1 = 2 — 百の位へ

規則が見えます。右から数えた位置どうしを足すと、答えのどの位に入るかが決まるのです。右から 0 番目と 0 番目を掛けた 12 は一の位へ。0 番目と 1 番目を掛けた 3 と 8 はどちらも十の位へ。1 番目と 1 番目を掛けた 2 は百の位へ。

だから答えを入れる箱は、2 つの数の桁数を足した数だけ用意しておけば足ります。それを超える位に値が入ることはありません。左から数えると位置が数の長さに依存してずれるので、必ず右から数えてください。

くり上がりは後回しでよい

上の例で、一の位の箱には 12 が入っています。1 桁に収まっていません。ここで慌てて直さなくても大丈夫です。すべて配り終えてから、右の箱から順に 10 で割った商を左へ渡していけば、最後には全部が 0 から 9 に収まります。

Python

d = [3, 12] # 左が十の位、右が一の位。まだ 10 以上が入っている d[0] += d[1] // 10 # くり上がりを左へ d[1] = d[1] % 10 print(d) # [4, 2] -> "42"

23 × 14 で同じことをすると、一の位が 2 でくり上がりが 1、十の位が 3 + 8 + 1 = 12 なので 2 でくり上がりが 1、百の位が 2 + 1 = 3 となり、322 になります。筆算の答えと一致しました。

掛け算の回数は、2 つの数の桁数の積です。10 桁どうしなら 100 回。桁数が増えても手に負えなくなるほどではありません。位置の計算さえ合っていれば、桁がいくつあっても同じ手順で通ります。

添字を間違えたときは、画面をにらむより紙に書くほうが早く直せます。23 × 14 くらいの小さな例で、箱の並びと位の対応を書き出してみてください。

よくある間違い

箱の左端に残った 0 を消し忘れることです。23 × 14 の箱は 4 つ用意しますが答えは 3 桁なので、そのままだと "0322" になります。逆に消しすぎると、答えが 0 のときに何も残らず空の文字列になります。0 になる場合だけは別扱いにしてください。

要件

  1. 整数型 (int, Number, long, BigInteger 等) に直接変換せず、桁ごとに筆算する
  2. 戻り値は積を表す文字列。先頭に 0 が並ばないこと ("0" 単独は OK)
  3. 片方でも "0" なら結果は "0" を返す

入出力例

stringMultiply("12", "34") → "408" stringMultiply("123", "456") → "56088" stringMultiply("0", "12345") → "0" stringMultiply("999", "999") → "998001" stringMultiply("2", "3") → "6" stringMultiply("10", "10") → "100" stringMultiply("100", "0") → "0"

ヒント

結果配列の長さは len(num1) + len(num2) で初期化し、最後に先頭の 0 を取り除く

num1[i] * num2[j] の結果は result[i+j+1] に足し、キャリーは result[i+j] に足す

桁の文字を数値にするときは int(ch) (Python)、Number(ch) (JS)、ch - '0' (Java/Go) を使う

生田 陸人
監修生田 陸人
ゆめさくエンジニア / 現役ソフトウェアエンジニア監修者プロフィールを見る →
編集 ゆめさく編集部·公開 2026/05/19·更新 2026/08/26

関連レッスン

  • アナグラムグルーピング

    文字列の配列を、同じ文字の並び替えになっているもの同士でグループ化する。ソートをキーにした hashmap 分類の典型問題。

  • 第4章まとめクイズ — 配列 / 文字列の応用

    双方向ポインタ・スライド窓・回文判定・最長部分文字列・文字列乗算・アナグラム分類の理解度を 1 問でチェックする章末クイズ。

  • 長方形クラス(面積と周長)

    クラスを使って長方形を表現し、面積と周長を計算する関数を `rectInfo(width, height)` で実装する。OOP の最初の一歩。

  • メモ化フィボナッチ

    再帰で計算したフィボナッチ数列の途中結果をキャッシュし、指数関数的な計算量を線形に減らす「メモ化」の手法を学ぶ。

main.py
学習モード
エディタを読み込んでいます

メモ

大きな数の文字列乗算

⌘S で保存