- ベストアンサー
隣同士の数字を足し合わせる
こんばんは、いつもお世話になっています ちょっとした計算をするプログラムについて、 考えているのですが、エラーが出て困っています。 いま A1 A2 A3 A4 A5・・・An といういくつかの数字があり(nは4以上です) まず A1+A2=B1 A2+A3=B3 ↓途中略 A(n-1)+An=B(n-1) を計算して、 B1+B2=C1 B2+B3=C2… という感じで、隣り合わせた数字同士の足し算をして、最終的に二つの数が残るまで演算をつづけるようなプログラムが作りたいんです。 ひとつ条件があって、足し合わせた二つの数が2桁以上になるときは、1の位だけ残すというものです。 で、考えたんですが、 まず並んでいる数字を左から順番にS(1),S(2)…S(n)に代入します。ここまではできました。 次に数字の個数を求めてmに代入し、(これもできました) For j=1 to m If j=m Then Answer=S(j-1)&S(j) Else S(j)=Suji(j)+Suji(j+1) If S(j)>=10 Then S(j)=S(j)/10 S(j)=FormatNumber(S(j),0) S(j)=S(j)*10 End If End If Next Response.Write S1 & "結果は" & Answer & "です" と書いてはみたものの、このまま実行すると 外側のIfと内側のIfで同じjを使っているせいかエラーが出ます。 こういうときはどうしたらよいのでしょうか また間違っているところがありましたら(というか、あると思うので、ヒントだけでもぜひ教えてください)
- みんなの回答 (10)
- 専門家の回答
質問者が選んだベストアンサー
問題点1 やりたいことは、 2つの数字の和を求める 列の長さが1になるまで続ける という2つのループがあるはずなのに、for文が2重になっていないのはおかしい。 問題点2 1の位がほしいだけならmod , C なら % 、剰余 を使えばらくちん S(j) = S(j) mod 10 あるいは、 S(j) = mod( S(j) , 10 )
その他の回答 (9)
- Oh-Orange
- ベストアンサー率63% (854/1345)
★回答者 No.7、No.8 です。 ・サンプルの1行目の Max に Suji() の要素数を最初にセットします。 ・それで、『Max = Max - 1 ←配列要素の最大値にするため』としているため、 『For i=0』とするとおかしくなりますよ。→『Suji(i - 1)』で要素以外を アクセスしてしまうため、『For i=0』は正しく動作しないですよ。 ・以上。おわり。→再帰版は質問者さん、頑張ってね!
お礼
あぁぁー。…S(1)をS(0)、S(2)をS(1)に代入するように命令文を追加してみます。 わざわざありがとうございます。すっきりしました。頑張ります。
- Ishiwara
- ベストアンサー率24% (462/1914)
#5,6です。 もちろん#7,8さんのプログラムでいいのですが、 Suji(j) = Suji(i - 1) + Suji(i) If Suji(j) > 9 Then ←2 桁以上なら Suji(j) = Suji(j) Mod 10 ←1 の位だけ残す End If をひとまとめにして Suji(j) = (Suji(i - 1) + Suji(i)) mod 10 というテもあります。 また、全部済んでから mod を1回だけ演算しても同じです。
お礼
そっか、なるほど!!勉強になりました。いろいろ書き方があるんですね。 何度もアドバイスしていただいて本当にありがとうございます。
- Oh-Orange
- ベストアンサー率63% (854/1345)
★追記。 ・計算結果は、Suji(0) と Suji(1) の2つです。 ・以上。おわり。
お礼
ご丁寧にありがとうございます。for=0のところを変えて使ってみようと思います。
- Oh-Orange
- ベストアンサー率63% (854/1345)
★面白そうなので私も参加させてもらいます。 ・まずアルゴリズムを整理します。→再帰処理なら楽ですがループ処理とします。 (1)『A1』『A2』『A3』…『An』の要素数を Max 変数に保存する (2)配列の2つ目の要素から隣り合う数字を足し算する (3)足した結果が 2 桁以上(9以上)ならば 1 の位だけを残す (4)足し算した結果は、同じ配列の1つ目の要素から順に上書きセットする (5)配列の要素が Max 変数の値まで来たら、次のループ処理に戻る→(1)へ (6)要素数の変数 Max が 2 つになるまで(1)~(5)を繰り返す ・これを元にプログラミングすると下のサンプルのようになります。 サンプル: Max = 100 ←配列Suji()の最大・要素数を Max にセット While Max > 2 Max = Max - 1 ←配列要素の最大値にするため j=0 ←計算結果のカウンタ変数 For i = 1 to Max Suji(j) = Suji(i - 1) + Suji(i) If Suji(j) > 9 Then ←2 桁以上なら Suji(j) = Suji(j) Mod 10 ←1 の位だけ残す End If j = j + 1 Next Wend 最後に: ・見やすいように全角のスペースでインデントしています。 ・解説コメントを入れているので活用して下さい。 ・以上。おわり。
お礼
楽なはずの再帰処理に悪戦苦闘しています。 こういう組み方もあるんですね。なんとか理解はできたんですがこれを自分で思いつくのは無理かもしれないです…。みなさんどうやってこんなプログラムを思いつかはるんでしょうか? どうもありがとうございました。
補足
ありがとうございます! サンプル一行目のMax=100というところがよくわからないのですが、本当ならSuji()の要素数を入れればよいのでしょうか?
- Ishiwara
- ベストアンサー率24% (462/1914)
#5です。 すみません。誤字訂正です。 ×再起的 → ○再帰的
お礼
ご丁寧にありがとうございます。
- Ishiwara
- ベストアンサー率24% (462/1914)
答さえ出ればよいのであれば、二項定理を使うと簡単ですよね。それぞれの項が、最終的に何回足されるかが2項係数です。なお、1桁化は、途中でやらないで、最後にやっても同じ。 また、プログラミングの練習としてやってみるのであれば、recursive(再起的)なサブプログラムの絶好のテーマだと思います。要するに、1列分だけのサブプログラムを作り、自分自身を呼び出せばよい。
お礼
プログラミングの練習です。二項定理ぃ~はちょっと記憶を…呼び戻す感じでいかないと…たしか確率のところで習ったような… なるほど、それぞれの項をたす数式と、それを何回繰り返すかを別々にするってことですかね?いろいろとありがとうございます。なんとかやってみます。
「1の位だけを残す」という部分だけ... MOD関数かMOD演算子を使えば可能です。 MOD演算子の場合、 35 MOD 10 で 5 588 MOD 10 で 8 が得られるハズです。
お礼
10で割ったあまり…なるほど!知りませんでした ありがとうございます。
- kb-nike
- ベストアンサー率36% (72/200)
ANo2 の補足: C/C++ と思い違いしていました。 アルゴリズムは利用できると思います、BASIC に書き換えてください。 眠くなってきたので書き換える意欲が湧きません…、御免なさい!
お礼
いえいえ、どうもありがとうございました。 がんばってみます。
- kb-nike
- ベストアンサー率36% (72/200)
int m, a[m個]; // 与えられた値 int i, j, max, b[m個]; max = m; while(1) { for(i=0; i<max-1; i++) { b[i] = a[i] + a[i+1]; if(b[i] > 9) b[i] = b[i] % 10; } for(j=0; j<max-1; j++) a[j] = b[j]; max = max - 1; if(max <= 2) break; } 答え: a[0],a[1]。
お礼
ご親切な回答ありがとうございます。これって、C言語?でしょうか…? 参考にさせていただきます。どうもありがとうございます。
お礼
こんな夜中にすみません。ヒントありがとうございます、ちょっと考えてみます。
補足
考えたのですが・・・ Dim m,j,k,n,nows m=mojisu n=mojisu For k=1 to n-1 For j=1 to m-1 Suji(j)=Suji(j)+Suji(j+1) nows=k If Suji(j)>=10 Then Suji(j) = Suji(j) mod 10 End If Next Next Answer=Suji(j-1)&Suji(j) としました。ここはこれであっているでしょうか… 数値はなんだかそれらしくて微妙に間違っているものが出ます。別のところがまちがっているのかもしれません。