• ベストアンサー

等差数列の終値を求める

【問題】等差数列の和から while 文を使って、等差数列の終値を求めるプログラムを作成せよ。 ・初期値、等差はともに1とする。 ・等差数列の和は適切な最小値に丸めてあつかう。 ※ 55~65入力の場合は10が出力される。前回、次の問題の意味をある方に教えていただきました。 この問題をとくプログラムをプログラムを作りました。 class bbb { public static void main(String[] args) { int n = 10; // 計算の焦点の項数 int Sk = 1; // k項までの和 int Sn = 55; // 第n項までの総和 int ak = 1; // int a1 = 0; // 初項 int d = 1; // 項差 System.out.println("start"); while (Sk < Sn) { ak = a1 + (n-1)*d; Sk += ak; n++; } System.out.println(a1 + (n - 2)*d); } } しかし、「55~65入力の場合は、10が出力される」はずですが出力されません。 どなたか修正をお願い致します。また、コメントも書いて頂ければ幸いです。

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

  • ベストアンサー
回答No.1

class Q3453468A { public static void main(String[] args) { // int n = 10; // 計算の焦点の項数 ←不要。というかこれを求めるべきだから。 int k = 1; // 以下nをkにした箇所が複数あるので注意。 int Sk = 0; // k項までの和 int Sn = 55; // 第n項までの総和(実際にはコマンドライン引数にした方が良い[宿題等であれば完成してません]) int ak = 0; // k項 int a1 = 0; // 初項(実際にはコマンドライン引数にした方が良い[宿題等であれば完成してません]) int d = 1; // 項差(実際にはコマンドライン引数にした方が良い[宿題等であれば完成してません]) System.out.println("start"); while (Sk <= Sn) { /* 等号入れたほうが後で処理しやすかった */ k++; /* 先頭に持ってきた方が解りやすかった。*/ ak = a1 + (k-1)*d; Sk += ak; } System.out.println(a1 + (k - 2) * d); //←最後の項の数字 // System.out.println(k - 1); ←第何項であるか。コメントアウトしてあるので実際には表示されない。 //コメントアウトを外したときの出力から //考えると初項0,項差1,11項目が10となる数列だとわかる } }

noname#61987
質問者

お礼

わかりやすいコメントをしていただき ありがとうございました!

その他の回答 (1)

  • age_momo
  • ベストアンサー率52% (327/622)
回答No.2

これはJAVAですかね。使ったことがないので動作確認ができないのですが。 (確かJ#ならあったと思うけど。。。) 1.#1さんの言うようにコマンドライン引数にするのが一番ですが、そうでなくても  プログラムの中で変更する予定のないものは定数化しましょう。 2.動作確認、プログラム内容の確認のためのテクニックをまず覚えましょう。   今回のプログラムの最大の間違いは最初にn=10と置いているところです。   コンパイラによると思いますが、仮想的に動作させて変数の内容を確認すれば   初項が1でないことがすぐに分かります。(n=10から始めればak=10になっているはずです)   ぱっと確認するなら途中にSystem.out.printlnを差し込んで変数の内容を   確認する方法も使えると思います。 3.基本的には上と同じですが、++や+=を使うときは初期の値に十分、気をつけましょう。 4.等差数列は前の項に公差を足せばいいのだから必ずしも一般項 a1 + (n-1)*dで値を   与える必要はありません。本来ならak+=dでも代用可能と思います。 (数値計算をプログラムするととてもじゃ無いけど一般項が出せないことが   多いですから、こういう使い方のほうが一般的だと思います。) 動作は保障できませんが、以下のようになると思います。 (基本的には#1さんと変わりません。初項1にしたかっただけです。 この言語にconstが使えなかったら消してください) class bbb { public static void main(String[] args) { const int Sn = 55; // 第n項までの総和 const int a1 = 1; // 初項 const int d = 1; // 項差 int n = 1; // 計算の焦点の項数←当たり前ですが、1です。 int ak = 1; // int Sk = 0; // k項までの和←こちらが0だと思います。 System.out.println("start"); while (Sk < Sn) { ak = a1 + (n-1)*d; Sk += ak; n++; } System.out.println(a1 + (n - 2)*d); } }

noname#61987
質問者

お礼

詳しい説明、ありがとうございます!

関連するQ&A