ツイッター出題回答
100桁の正の整数値の足し算

ExcelマクロVBAとエクセル関数についての私的雑感
公開日:2020-07-09 最終更新日:2020-12-19

100桁の正の整数値の足し算


ツイッターで出したVBAのお題です。
数の単位に「無量大数」というものがあります。
VBAでこの無量大数の足し算をするにはどうしたら良いでしょうか。
そこで、100桁の正の整数の足し算をVBAで実現してみましょう。


お題のツイート

VBA マクロ 100桁の正の整数値の足し算

https://twitter.com/yamaoka_ss/status/1280852480239136768

【VBA問題】
数の単位に「無量大数」というものがある。
その桁数は10^68(10^88とする場合もあるよう)です。
VBAでこの無量大数の足し算をしたいと思います。
この際、区切りよく100桁の足し算をしてください。
※入力は10進文字列
※足し算だけで良い


https://twitter.com/yamaoka_ss/status/1281036947125751809

いくつかご意見いただきましたが、
正の整数限定です。
関数の2つの引数を足し算するだけです。

解説のツイート

以下で一連の解説ツイートをしています。

https://twitter.com/yamaoka_ss/status/1281187834502590464


この問題を出すのには裏事情がありました。
RSet、LSetの説明ページを作りたかったのですが、実際に使う事がほとんどないために書けずにいました。
特にLSetでユーザー定義型をコピーする説明を書いておきたかったのですが、、、
私の回答VBAは、これを題材としたものになっています。


VBAで扱える正の整数値としては、
Longが~2147483647
Currencyが~922337203685477
LongLongが~9223372036854775807
Decimalが~79228162514264337593543950335
※Decimalは変数宣言できません。VariantとCDec関数を使用します。
いずれにしても100桁には遠く及びません。


100桁を扱う方法としては、VBAで計算できる桁数に区切り、足し算しつつ繰り上げしていけば良いでしょう。
区切り単位は、Longの有効桁数の9桁以内でしょう。
例えば5桁なら、結果が6桁になれは先頭の1桁を左の区切りに加算します。
計算が終わったら結果を文字列として連結すれば完成します。


面倒なのは、右から区切らなければならない点と、2つの数値の桁位置を揃える部分でしょう。
そこで、1桁なら区切るのも桁位置も簡単なので、まずは1桁でやってみると良いと思います。
1桁なら1文字ずつ区切ればよいので簡単です。
後は2つの数値の桁数を意識すれば良いだけです。


桁数を揃えるには、大きい数値の桁数に小さい数値の桁数を揃えることになります。
筆算するなら1の位の位置を揃えて書きます。
つまり右端から足し算していくことになります。
小さい数値の頭に大きい数値と同じ桁数になるだけの0を付け足して同じ桁数にするのも良いでしょう。


ほえほえさんから、具体的なVBAの回答をいただきました。
https://twitter.com/hoehoe1234/status/1280901878910316544
桁位置や繰り上がりの部分はぜひ参考に読み解いてみてください。


私の用意したVBAは、
桁数を揃えるのにRSetを使い、
1文字区切りの方法としてLSetでユーザー定義型のコピーを使っています。
MSでは推奨されていない方法ですが、こういう事もできるという紹介になります。

「LSetとユーザー定義型のコピー(100桁の足し算)」

https://excel-ubara.com/excelvba4/EXCEL_VBA_442.html
数の単位に「無量大数」というものがあります。その桁数は10^68(10^88とする場合もあるよう)です。VBAでこの無量大数の足し算をするにはどうしたら良いでしょうか。方法としては、VBAで計算できる桁数にちぎって足し上げていけば良いでしょう。


追記
小数点を扱う場合は小数点で分割して同様の事をすれば良いでしょう。
マイナス数値を扱う場合は引き算を実装すれば良いと思います。
方法は各種ありますが、
大から小の引き算が出来れば、符号と絶対値の大小比較で、足し算とこの引き算で計算できます。
暗算する時にやっている事ですね。




同じテーマ「ツイッター出題回答 」の記事

Variantの数値型と文字列型の比較
Variant仮引数にRange.Valueを配列で渡す方法
Variant仮引数のByRefとByValの挙動違い
100桁の正の整数値の足し算
「VBA Match関数の限界」についての誤解
VBAで数値を漢数字に変換する方法
囲碁で相手の石を囲んで取るアルゴリズム
VBAで「3Lと5Lのバケツで4Lの水を作る」を解く
言語依存の関数を使用できるFormulaLocal
配列のUBoundがLBoundがより小さいことはあり得るか
コレクションの要素を削除する場合


新着記事NEW ・・・新着記事一覧を見る

ExcelマクロVBA入門目次|エクセルの神髄(2024-03-20)
VBA10大躓きポイント(初心者が躓きやすいポイント)|VBA技術解説(2024-03-05)
テンキーのスクリーンキーボード作成|ユーザーフォーム入門(2024-02-26)
無効な前方参照か、コンパイルされていない種類への参照です。|エクセル雑感(2024-02-17)
初級脱出10問パック|VBA練習問題(2024-01-24)
累計を求める数式あれこれ|エクセル関数応用(2024-01-22)
複数の文字列を検索して置換するSUBSTITUTE|エクセル入門(2024-01-03)
いくつかの数式の計算中にリソース不足になりました。|エクセル雑感(2023-12-28)
VBAでクリップボードへ文字列を送信・取得する3つの方法|VBA技術解説(2023-12-07)
難しい数式とは何か?|エクセル雑感(2023-12-07)


アクセスランキング ・・・ ランキング一覧を見る

1.最終行の取得(End,Rows.Count)|VBA入門
2.RangeとCellsの使い方|VBA入門
3.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
4.繰り返し処理(For Next)|VBA入門
5.変数宣言のDimとデータ型|VBA入門
6.ブックを閉じる・保存(Close,Save,SaveAs)|VBA入門
7.並べ替え(Sort)|VBA入門
8.条件分岐(IF)|VBA入門
9.セルのクリア(Clear,ClearContents)|VBA入門
10.マクロとは?VBAとは?VBAでできること|VBA入門




このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。


記述には細心の注意をしたつもりですが、
間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。
掲載のVBAコードは動作を保証するものではなく、あくまでVBA学習のサンプルとして掲載しています。
掲載のVBAコードは自己責任でご使用ください。万一データ破損等の損害が発生しても責任は負いません。



このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。
本文下部へ