• ベストアンサー

隣同士の数字を足し合わせる

こんばんは、いつもお世話になっています ちょっとした計算をするプログラムについて、 考えているのですが、エラーが出て困っています。 いま 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を使っているせいかエラーが出ます。 こういうときはどうしたらよいのでしょうか また間違っているところがありましたら(というか、あると思うので、ヒントだけでもぜひ教えてください)

質問者が選んだベストアンサー

  • ベストアンサー
  • NNori
  • ベストアンサー率22% (377/1669)
回答No.1

問題点1 やりたいことは、  2つの数字の和を求める  列の長さが1になるまで続ける という2つのループがあるはずなのに、for文が2重になっていないのはおかしい。 問題点2 1の位がほしいだけならmod , C なら % 、剰余 を使えばらくちん S(j) = S(j) mod 10 あるいは、 S(j) = mod( S(j) , 10 )

analogy
質問者

お礼

こんな夜中にすみません。ヒントありがとうございます、ちょっと考えてみます。

analogy
質問者

補足

考えたのですが・・・ 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) としました。ここはこれであっているでしょうか… 数値はなんだかそれらしくて微妙に間違っているものが出ます。別のところがまちがっているのかもしれません。

その他の回答 (9)

  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.10

★回答者 No.7、No.8 です。 ・サンプルの1行目の Max に Suji() の要素数を最初にセットします。 ・それで、『Max = Max - 1 ←配列要素の最大値にするため』としているため、  『For i=0』とするとおかしくなりますよ。→『Suji(i - 1)』で要素以外を  アクセスしてしまうため、『For i=0』は正しく動作しないですよ。 ・以上。おわり。→再帰版は質問者さん、頑張ってね!

analogy
質問者

お礼

あぁぁー。…S(1)をS(0)、S(2)をS(1)に代入するように命令文を追加してみます。 わざわざありがとうございます。すっきりしました。頑張ります。

  • Ishiwara
  • ベストアンサー率24% (462/1914)
回答No.9

#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回だけ演算しても同じです。

analogy
質問者

お礼

そっか、なるほど!!勉強になりました。いろいろ書き方があるんですね。 何度もアドバイスしていただいて本当にありがとうございます。

  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.8

★追記。 ・計算結果は、Suji(0) と Suji(1) の2つです。 ・以上。おわり。

analogy
質問者

お礼

ご丁寧にありがとうございます。for=0のところを変えて使ってみようと思います。

  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.7

★面白そうなので私も参加させてもらいます。 ・まずアルゴリズムを整理します。→再帰処理なら楽ですがループ処理とします。 (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 最後に: ・見やすいように全角のスペースでインデントしています。 ・解説コメントを入れているので活用して下さい。 ・以上。おわり。

analogy
質問者

お礼

楽なはずの再帰処理に悪戦苦闘しています。 こういう組み方もあるんですね。なんとか理解はできたんですがこれを自分で思いつくのは無理かもしれないです…。みなさんどうやってこんなプログラムを思いつかはるんでしょうか? どうもありがとうございました。

analogy
質問者

補足

ありがとうございます! サンプル一行目のMax=100というところがよくわからないのですが、本当ならSuji()の要素数を入れればよいのでしょうか?

  • Ishiwara
  • ベストアンサー率24% (462/1914)
回答No.6

#5です。 すみません。誤字訂正です。 ×再起的 → ○再帰的

analogy
質問者

お礼

ご丁寧にありがとうございます。

  • Ishiwara
  • ベストアンサー率24% (462/1914)
回答No.5

答さえ出ればよいのであれば、二項定理を使うと簡単ですよね。それぞれの項が、最終的に何回足されるかが2項係数です。なお、1桁化は、途中でやらないで、最後にやっても同じ。 また、プログラミングの練習としてやってみるのであれば、recursive(再起的)なサブプログラムの絶好のテーマだと思います。要するに、1列分だけのサブプログラムを作り、自分自身を呼び出せばよい。

analogy
質問者

お礼

プログラミングの練習です。二項定理ぃ~はちょっと記憶を…呼び戻す感じでいかないと…たしか確率のところで習ったような… なるほど、それぞれの項をたす数式と、それを何回繰り返すかを別々にするってことですかね?いろいろとありがとうございます。なんとかやってみます。

noname#79209
noname#79209
回答No.4

「1の位だけを残す」という部分だけ... MOD関数かMOD演算子を使えば可能です。 MOD演算子の場合、 35 MOD 10 で 5 588 MOD 10 で 8 が得られるハズです。

analogy
質問者

お礼

10で割ったあまり…なるほど!知りませんでした ありがとうございます。

  • kb-nike
  • ベストアンサー率36% (72/200)
回答No.3

ANo2 の補足: C/C++ と思い違いしていました。 アルゴリズムは利用できると思います、BASIC に書き換えてください。 眠くなってきたので書き換える意欲が湧きません…、御免なさい!

analogy
質問者

お礼

いえいえ、どうもありがとうございました。 がんばってみます。

  • kb-nike
  • ベストアンサー率36% (72/200)
回答No.2

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]。

analogy
質問者

お礼

ご親切な回答ありがとうございます。これって、C言語?でしょうか…? 参考にさせていただきます。どうもありがとうございます。

関連するQ&A

専門家に質問してみよう