• ベストアンサー

等差数列の終値を求める

【問題】等差数列の和から 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

  • 等差数列

    初項-60、第15項までの和が-60である等差数列がある。 (1)初項から第何項までの和が最小となるか?   答.第8項 (2)初項から第何項までの和がはじめて900を超えるか?   答.第26項 という問題がありました。 (1)は公差が8というのを求め、an=a+(n-1)d<0を満たすnを求めてやり、n<8.5がでたので、答えは第8項となりました。 問題は(2)で、僕の考えではSn=1/2{2a+(n-1)d)}>900を満たすnを求めればいいと思ったのですが、そうすると、n>14.45…となってしまいます。 どこがいけないのでしょうか。回答よろしくお願いします。

  • 等差数列

    等差数列{an}(n=1,2,3,・・)の初項から第n項までの和をSnとする。Snを大きい順に並べると第3項までがそれぞれ22,21,20となるとき、この数列の一般項{an}を求める({an}は無限数列)んですけど、どうすればいいのかわかりません。

  • 等差数列の問題で質問です。

     ある等差数列の第n項をanとするとき、 a10+a11+a12+a13+a14=365、       a15+a17+a19=-6 が成立している。 (1)この数列の初項と公差を求めよ。 (2)この等差数列の初項から第n項までの和をSnとするとき、Snの最大値を求めよ。  見にくくてすみませんが、教えてください。チャートにも載っておらず自力では解けませんでした。 なるたけ早い回答が嬉しいので、(1)だけでも分かれば教えてください。

  • 等差数列

    第7項が49、第16項がー5となる等差数列〔an〕の初項を求めるのはわかるのですが、この初項から第n項までの和Snが最大となるときのnの値、および最大値Snを求める方法がわかりません。 Snの最大値とan>=0とはどんな関係があるのでしょうか? どうしてan>=0がでてくるのでしょうか?

  • 等差数列の和を求めるプログラム

    初項1公差1の等差数列の第10項までSn = {1,2,3,・・・,10}の和を、while文を使って算出するプログラムを作成せよ。この様な問題があるのですが、どの様にして和をプログラムすれば良いのか分かりません。どなたか教えて頂けませんかm(_ _"m)ペコリ

  • 等差数列です。

    等差数列{an}はa2+a4=16, a3+a5=22を満たしている。このとき、数列{an}の初項(ア),公差(イ)である。また等差数列{bn}は初項から第5項までの和が45、第6項から第10項までの和が145である。この時数列{bn}との初項は(ウ),公差は(エ)である。二つの数列{an}に共通な項を小さい順にC1,C2,C3....,,,,とすると数列{Cn}は初項が(オ)、公差が(カキ)の等差数列である。 また、二つの数列{an}と{bn}の少なくとも一方に含まれている項を小さい順に並べて、d1,d2,d3,......とする。ただし共通な項はいずれか一方のみを並べるものとする。この時、dn>100を満たす最小の整数nは(クケ)であり、d(クケ)=(コサシ)であるさらにΣ[i=k,n],(クケ)=(スセソタ)である。 よろしくお願いします。上手く書けませんでした御理解いただけたでしょうか。

  • 等差数列

    等差数列{an}はa2+a4=16, a3+a5=22を満たしている。このとき、数列{an}の初項(ア),公差(イ)である。また等差数列{bn}は初項から第5項までの和が45、第6項から第10項までの和が145である。この時数列{bn}との初項は(ウ),公差は(エ)である。二つの数列{an}に共通な項を小さい順にC1,C2,C3....,,,,とすると数列{Cn}は初項が(オ)、公差が(カキ)の等差数列である。 また、二つの数列{an}と{bn}の少なくとも一方に含まれている項を小さい順に並べて、d1,d2,d3,......とする。ただし共通な項はいずれか一方のみを並べるものとする。この時、dn>100を満たす最小の整数nは(クケ)であり、d(クケ)=(コサシ)であるさらにΣ[i=k,n],(クケ)=(スセソタ)である。 よろしくお願いします。昨夜投稿しましたがうまく投稿出来たかどうかわからないので再度投稿しました。もし重なっていましたらごめんなさい。よくわからないので。 投稿の注意点も教えていただけたら嬉しいです。

  • 等差数列{an}がa3=96,a9=54を・・・

    等差数列{an}がa3=96,a9=54をみたすとき、初項は□、公差は□である。 この数列の初項から第n項までの和Snが初めて負になるのはn=□のときで、その時Sn=□である。 □の部分をお願いします!

  • 数列の問題です

    質問がいくつかありますが、よろしくお願いします 次の数列の初項~n項までの和を求めよ 1、1+4、1+4+7 与えられた数列の第k項をAkとし、求める和をSnとする ここで一つ目の質問です! なぜn項まで求めよといわれてるにもかかわらず、第k項までの一般項を求め和を出そうとするんでしょうか 続き Ak=1+4+7+・・・+{1+(k-1)・3} ここで二つ目の質問です! この式はどのようにして出したんですか? 1、1+4、1+4+7 という数列にもかかわらず2項目1やら3項目の4はどこへ消えてしまったんでしょうか? そして最後の質問です Σというのは和を表すと書いてあるんですが ならば 等差、等比数列の和の公式は必要なくありませんか? またはΣ公式などを使わなくても全て等差、等比数列の和の公式でできるんじゃないでしょうか? なぜわざわざ分けているのでしょうか? 質問が多くて恐縮ですが 解説よろしくお願いします。

  • 等差数列{an}の初項から第n項まてまの和をSnと

    等差数列{an}の初項から第n項まてまの和をSnとする。S10=100、S20=400であるとき、Snを求めよ。 という問題で、 なぜSn=100であるから 1/2・10(2a+9d)=10 という式が出てくるのかわかりません(>_<) どなたか理由を教えてください…

このQ&Aのポイント
  • TS8230プリンターのディスクレーベル印刷ができなくなったので、印刷方法を教えてください。
  • TS8230プリンターのEasy-PhotoPrint Editorを使用してディスクレーベル印刷をしていましたが、印刷できなくなりました。
  • 以前は印刷できていたのに、突然ディスクレーベル印刷ができなくなりました。解決方法を教えてください。
回答を見る