ツイッター出題回答
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の数値型と文字列型の比較

ツイッターで出したVBAのお題です。Variant型は、どんなデータ型も入れることができます。具体的なデータ型の代わりに使用することで、より柔軟にVBA記述ができるようになります。ただしその一方で、少々特殊な挙動もあり、使いこなすにはそれなりの知識が必要になる場合もあります。
Variant仮引数にRange.Valueを配列で渡す方法
ツイッターで出したVBAのお題です。Variant型は、どんなデータ型も受け入れることができます。RangeオブジェクトのValueを配列で受け取るにはVariant変数が必要です。ただし、実引数にRangeオブジェクトを直接指定する場合には注意が必要です。
Variant仮引数のByRefとByValの挙動違い
ツイッターで出したVBAのお題です。Variant型は、どんなデータ型も入れることができてしまいます。具体的なデータ型の代わりに使用することで、より柔軟にVBA記述ができるようになります。ただしこの便利さゆえに、逆に注意しなければならない挙動もあります。
100桁の正の整数値の足し算
「VBA Match関数の限界」についての誤解
ツイッターで出したVBAのお題です。発端はエゴサーチからです。(笑) 「教えて!goo」で引用されていたのを見つけました。あちこちで引用されているのは見かけることはあるのですが、以下ではよく言うディスられているような文章を見かけました。
VBAで数値を漢数字に変換する方法
ツイッターで出したVBAのお題です。算用数字を漢数字に変換するVBAです。滅多に必要になるものではないのに、なぜこんな問題を出したかと言うと、最近シリーズで書き始めた「Excel将棋」で必要になったからです。
囲碁で相手の石を囲んで取るアルゴリズム
ツイッターで出したVBAのお題です。Excel囲碁を作っていて、相手の石を囲んで取れるかどうかの判定、相手の石を取るにはどうしたら良いかというもの。囲碁で相手の石をとる ここで、8二に黒を打てば、このように囲まれている白が取られます。
VBAで「3Lと5Lのバケツで4Lの水を作る」を解く
ツイッターでVBAのお題として出したものです。昔からよくある問題です。「3Lと5Lのバケツで4Lの水を作る」これをVBAを使って自動で求めてみようという事です。VBA問題:ツイートの記録 【VBA問題】 「3Lと5Lのバケツで4Lの水を作る」・2つの容器サイズは変えられるように引数で受け取る (3,5,
言語依存の関数を使用できるFormulaLocal
ツイッターでVBAのお題として出したものです。複数セルに一括で数式を入れるバ宇井の記述と、言語環境に依存する関数をセルに設定する場合のFormulaプロパティの使い方についての問題です。問題を出したツイート A1:A10セルに半角の英数文字が入っているので、これを全角で表示するためにB1:B10セルに数式をVBAで…
配列のUBoundがLBoundがより小さいことはあり得るか
ツイッターでVBAのお題として出したものです。配列の下限が上限より大きくなるような配列は存在するかの問題です。LBound(ary)>UBound(ary) この条件を満たすような配列は存在するか? 問題を出したツイート 配列の下限と上限を調べるにはLBound関数とUBound関数を使います。
コレクションの要素を削除する場合
ツイッターで出したVBAのお題(投票)です。Collectionから要素を順に削除するVBAの正誤問題です。問題を出したツイート 【VBA問題】 DimcAsNewCollection Dimi Fori=1To100 c.Addi,CStr(i) Next Fori=1To100 c.Remove□ Next 四…


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

ブール型(Boolean)のis変数・フラグについて|VBA技術解説(2024-04-05)
テキストの内容によって図形を削除する|VBA技術解説(2024-04-02)
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)


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

1.最終行の取得(End,Rows.Count)|VBA入門
2.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
3.RangeとCellsの使い方|VBA入門
4.ひらがな⇔カタカナの変換|エクセル基本操作
5.繰り返し処理(For Next)|VBA入門
6.変数宣言のDimとデータ型|VBA入門
7.ブックを閉じる・保存(Close,Save,SaveAs)|VBA入門
8.並べ替え(Sort)|VBA入門
9.セルのクリア(Clear,ClearContents)|VBA入門
10.Findメソッド(Find,FindNext,FindPrevious)|VBA入門




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


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


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