プロが教えるわが家の防犯対策術!

こんばんは、いつもお世話になっています
ちょっとした計算をするプログラムについて、
考えているのですが、エラーが出て困っています。

いま
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を使っているせいかエラーが出ます。
こういうときはどうしたらよいのでしょうか
また間違っているところがありましたら(というか、あると思うので、ヒントだけでもぜひ教えてください)

A 回答 (10件)

問題点1


やりたいことは、
 2つの数字の和を求める
 列の長さが1になるまで続ける
という2つのループがあるはずなのに、for文が2重になっていないのはおかしい。

問題点2
1の位がほしいだけならmod , C なら % 、剰余 を使えばらくちん
S(j) = S(j) mod 10
あるいは、 S(j) = mod( S(j) , 10 )

この回答への補足

考えたのですが・・・
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)

としました。ここはこれであっているでしょうか…
数値はなんだかそれらしくて微妙に間違っているものが出ます。別のところがまちがっているのかもしれません。

補足日時:2007/02/16 02:17
    • good
    • 0
この回答へのお礼

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

お礼日時:2007/02/16 01:36

★回答者 No.7、No.8 です。


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

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

お礼日時:2007/02/17 21:49

#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回だけ演算しても同じです。
    • good
    • 0
この回答へのお礼

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

お礼日時:2007/02/17 20:52

★追記。


・計算結果は、Suji(0) と Suji(1) の2つです。
・以上。おわり。
    • good
    • 0
この回答へのお礼

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

お礼日時:2007/02/17 20:40

★面白そうなので私も参加させてもらいます。


・まずアルゴリズムを整理します。→再帰処理なら楽ですがループ処理とします。
(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()の要素数を入れればよいのでしょうか?

補足日時:2007/02/17 19:25
    • good
    • 0
この回答へのお礼

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

お礼日時:2007/02/17 20:47

#5です。


すみません。誤字訂正です。
×再起的 → ○再帰的
    • good
    • 0
この回答へのお礼

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

お礼日時:2007/02/16 19:22

答さえ出ればよいのであれば、二項定理を使うと簡単ですよね。

それぞれの項が、最終的に何回足されるかが2項係数です。なお、1桁化は、途中でやらないで、最後にやっても同じ。

また、プログラミングの練習としてやってみるのであれば、recursive(再起的)なサブプログラムの絶好のテーマだと思います。要するに、1列分だけのサブプログラムを作り、自分自身を呼び出せばよい。
    • good
    • 0
この回答へのお礼

プログラミングの練習です。二項定理ぃ~はちょっと記憶を…呼び戻す感じでいかないと…たしか確率のところで習ったような…

なるほど、それぞれの項をたす数式と、それを何回繰り返すかを別々にするってことですかね?いろいろとありがとうございます。なんとかやってみます。

お礼日時:2007/02/16 19:38

「1の位だけを残す」という部分だけ...


MOD関数かMOD演算子を使えば可能です。
MOD演算子の場合、
35 MOD 10 で 5
588 MOD 10 で 8
が得られるハズです。
    • good
    • 0
この回答へのお礼

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

お礼日時:2007/02/16 19:18

ANo2 の補足:


C/C++ と思い違いしていました。
アルゴリズムは利用できると思います、BASIC に書き換えてください。

眠くなってきたので書き換える意欲が湧きません…、御免なさい!
    • good
    • 0
この回答へのお礼

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

お礼日時:2007/02/16 02:55

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]。
    • good
    • 0
この回答へのお礼

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

お礼日時:2007/02/16 02:54

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!