こんばんは、いつもお世話になっています
ちょっとした計算をするプログラムについて、
考えているのですが、エラーが出て困っています。
いま
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を使っているせいかエラーが出ます。
こういうときはどうしたらよいのでしょうか
また間違っているところがありましたら(というか、あると思うので、ヒントだけでもぜひ教えてください)
No.10
- 回答日時:
★回答者 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)に代入するように命令文を追加してみます。
わざわざありがとうございます。すっきりしました。頑張ります。
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回だけ演算しても同じです。
そっか、なるほど!!勉強になりました。いろいろ書き方があるんですね。
何度もアドバイスしていただいて本当にありがとうございます。
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
最後に:
・見やすいように全角のスペースでインデントしています。
・解説コメントを入れているので活用して下さい。
・以上。おわり。
この回答への補足
ありがとうございます!
サンプル一行目のMax=100というところがよくわからないのですが、本当ならSuji()の要素数を入れればよいのでしょうか?
楽なはずの再帰処理に悪戦苦闘しています。
こういう組み方もあるんですね。なんとか理解はできたんですがこれを自分で思いつくのは無理かもしれないです…。みなさんどうやってこんなプログラムを思いつかはるんでしょうか?
どうもありがとうございました。
No.6
- 回答日時:
#5です。
すみません。誤字訂正です。
×再起的 → ○再帰的
No.5
- 回答日時:
答さえ出ればよいのであれば、二項定理を使うと簡単ですよね。
それぞれの項が、最終的に何回足されるかが2項係数です。なお、1桁化は、途中でやらないで、最後にやっても同じ。また、プログラミングの練習としてやってみるのであれば、recursive(再起的)なサブプログラムの絶好のテーマだと思います。要するに、1列分だけのサブプログラムを作り、自分自身を呼び出せばよい。
プログラミングの練習です。二項定理ぃ~はちょっと記憶を…呼び戻す感じでいかないと…たしか確率のところで習ったような…
なるほど、それぞれの項をたす数式と、それを何回繰り返すかを別々にするってことですかね?いろいろとありがとうございます。なんとかやってみます。
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]。
No.1ベストアンサー
- 回答日時:
問題点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)
としました。ここはこれであっているでしょうか…
数値はなんだかそれらしくて微妙に間違っているものが出ます。別のところがまちがっているのかもしれません。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) VBAで組み合わせ算出やCOUNTIFSの処理を高速化したいです。 4 2022/04/07 02:38
- Visual Basic(VBA) ファイル全てを .xlsm に変更したところ、プログラムが途中で落ちてしまっています 17 2022/12/07 12:03
- Excel(エクセル) エクセル 関数について質問です。 2 2022/10/03 11:14
- Visual Basic(VBA) 数字が「0」の列を削除するため、下記のコードを実行しましたが、コンパイルエラーSubまたはFunct 3 2022/12/04 00:00
- Excel(エクセル) ExcelのIF関数について 4 2023/05/24 12:54
- Visual Basic(VBA) vba 等間隔の列に対しての計算 6 2022/05/17 20:15
- Excel(エクセル) エクセルで同じ数字同士を自動で線で結ぶVBAを教えてください 6 2022/04/26 23:13
- Excel(エクセル) If関数に関する質問です。(再掲) 3 2022/10/01 20:51
- Excel(エクセル) Excelの空文字判定について 7 2023/01/06 13:25
- Visual Basic(VBA) コード名シートA列と集計シートA列のコードが一致したら、コード名シートA5からk12の範囲をコピーし 1 2022/08/29 23:46
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
隣同士の数字を足し合わせる
-
参照配列の要素数の求め方は?
-
クラスに配列を渡す方法
-
VBAのautofilter、criteriaの配...
-
二次元配列における要素数のは...
-
Powershell $変数 = @()の空配...
-
Dim flag(4) as boolean で配列...
-
Perlのデータ変換
-
UWSCに制限時間を付けたいです
-
エクセルの当番表を作っていま...
-
画面を強制的に再描画させる方法
-
まったく同じファイルのハッシ...
-
プログラムの機能を変えずに高...
-
VBA for i=1 to lastrow
-
UWSCの終了の仕方
-
DoEventsが必要な理由について
-
どなたかこのプログラミングを...
-
テキストボックスの名前に変数...
-
vb.netからエクセル関数書き込み
-
pythonでファイルのコメント行...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBAのautofilter、criteriaの配...
-
二次元配列のインデックスについて
-
リストボックスに縦スクロール...
-
Excel VBA ユーザーフォームの...
-
マクロ Publicでの配列定義
-
エクセルVBAでTransposeの不思議
-
Strawberry Perl for Windows ...
-
二次元配列における要素数のは...
-
perlで2次元配列をサブルーチ...
-
クラスに配列を渡す方法
-
Dim flag(4) as boolean で配列...
-
文字の整列(printf)
-
perlで配列の要素が空なのを知...
-
jcode->jfold で禁則処理
-
VB6で配列の最大値を簡単に求め...
-
perl 配列の要素数について
-
ファイル名に日付・時刻を付与...
-
チェックボックスのperlでの値...
-
組み合わせについての質問です...
-
配列を初期化する時ってどうす...
おすすめ情報