それではまずは出題者であるsupermabさんからです。(^O^)
************************************************************************************
今回、
せっかく出会うことの出来た「関数でできますか?」を
大切にしたいという思いから、、、
「問題が不足してるよーーー」ってことで、、、
身のほどもわきまえずに、出題させていただきましたwww
しかしながら、当初は自らの実力を上回る皆様に対して、
出題することがいかに難しい事か?
ちっとも考えては居りませんでした。
すなわち!
自分には出来る問題=あまりにも簡単
なので、つまらないのではないか?
(そーではないことに、今は気づいた!)
でも、
到底無理なものではいけない!
(そりゃそーだと、今も思う)
つまり、自分にはできないけど・・・
皆様には、、出来る。。。
でも、たやすくは無い。。。
(この考えは間違っていた!)
そんな問題を考えたつもりでした。。。
でも、
皆様に知恵を絞っていただいて、、良かったです ^^;
今は、皆様の解答を楽しみにする気持ちでいっぱいです。
なので、
出題者の解答は、、、ちっとも参考になりませんけど・・・
悪しからずご了承ください m(_ _)m
皆様が、お考えになっていただき、、、
深く感謝申し上げます。
(supermabさん談)
「足し算」 出題者解答のアルゴリズムの解説:
1:計算パターンの解析
まず、はじめに基本的な計算のパターンについて考えると、
2数の正負の組合せによって、実際に行う演算は下記のように
加算の場合と、減算の場合に分けられます。
①A+B
②-A+(-B)=-(A+B)
③-A+B=B-A or =-(A-B)
④A+(-B)=A-B or =-(B-A)
①と②の場合は、加算を行い、②の場合は結果に -1 を掛けます。
③と④の場合は、減算を行うわけであるが、、実際の計算では、絶対値の大きさによって、
A、Bどちらから引き算を行うか判断しなければならず、
絶対値が大きな数が負の場合は、符号付加の処理が必要となります。
このことから、6通りの計算パターンがあるとわかります。
2:分割計算の場合分けの解析
つぎに、2数の桁数が15桁以上となる場合があることから、、
上記の計算は、分割計算しなければならない(のかもしれません)。
ここに、加算における繰り上げ処理と、減算における繰り下げ処理が発生するので、
この問題を回避するため、=B1+B3 による、上位桁の解を利用する方法を考えました。
すなわち、単純加算による計算結果を利用して、、
失われた下数けたの情報を取得・修正する方法です。
もし、計算結果が15桁を超えなければ、修正の必要は発生しないので、効率的です。
よって、計算結果が15桁を超えた場合のみ、補正をかけることにしました。
さて、①~④の計算において、どのように補正すればよいか考えてみると・・・
①の場合~ ①の場合は、下数けたを切り出した数値同士を加算した結果の下数桁を切り出し
単純加算の解の下数桁と入れ変えればよい。
②の場合~ ②の場合も、①と同様に処理したのち、-1を掛ければよい。
③、④の場合~ 絶対値の大きな数からの引き算となるので、繰り下がりのために、引かれる数は
一桁おおきな数にして、計算しなければならない。
となります。
3:総合
上記1、2の問題を総合して考えると、
加算か減算か?(どちらも計算して、選択すればよい→積が正なら加算、負なら減算)
絶対値の大きいのはどちらか?(絶対値順でセルに入れる)
符号はどちらか?(単純加算の結果でわかる)
有効桁数は何桁か?
の4点を考慮すればよいとわかります。
ので、上記のような
作業セル=10個、総文字数=293 文字 の式を出させていただきました。
(式で利用はしてませんが、式の意味をわかりやすくするために、名前を付けてます)
4:例外
で、
この式では、「桁数が大きく補正が必要な場合」 AND 「2数の絶対値の差が8桁に満たない場合」
に、B17セルが #VALUE エラーとなって、正しく解を出力することが出来ません(はず)。
従って、この解答は「1000回クリアの一か八か版」って、ところです ^^;
が、
実際には、10万回程度の試行では、エラーとなりませんでしたので、、、
若干不思議です。。。。
Q26_SuperMab_san.zipをダウンロード
**************************************************************************************
次はy sakudaさんです。
Q26_sakuda_san.zipをダウンロード
***************************************************************************************
む印さんです。
--------------------------------
一応1000回クリア版です、、
<考え方>
B1+B3が15桁を超えた下の桁は0となるので、B1とB3の下9桁での足し算してその部分を補う事にしました。
<式のレシピ>
B1とB2の符号は無視して、数字部分が ①大きい方の右端から9文字を切り出して1,000,000,000を加算し
②小さい方も右端から9文字を切り出し、B1とB3が同じ符号の場合は1をそうでない場合は-1を乗じて
①と②を合計すると、下9桁では符号に合った足し算が成立します。
MODで、その下9桁の部分を数値化して取り出しておき、B1+B3から取り出した文字数分下の桁をカットして
取り出した数値の左にドッキングさせて出来上がりです。
(む印さん談)
Q26_Muin_San.lzhをダウンロード
**************************************************************************************
TOさんです。
--------------------------------------------------------------------------
こんちは^^
笑わないでね~^^;
(TOさん談)
***************************************************************************************
ジョー3さんです。
***************************************************************************************
kirさんです。
最近のコメント