質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
for

for文は、様々なプログラミング言語で使われている制御構造です。for文に定義している条件から外れるまで、for文内の命令文を繰り返し実行します。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

2回答

4878閲覧

java for文 階差数列のコード

se_hatena2525

総合スコア3

for

for文は、様々なプログラミング言語で使われている制御構造です。for文に定義している条件から外れるまで、for文内の命令文を繰り返し実行します。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

1クリップ

投稿2020/04/26 06:27

編集2020/04/27 00:10

AndroidStudioのエミュレーターに
1

2

4

7

11

16

と【for文】と【階差数列】を利用して表示させたかったのですが、調べてもわかりませんでした。

【トライしてみたコード】

private String callSubject(){

String resultStr = “ ”;

for(i=1; i<=16; i??){

resultStr+= i;

}

}

??のところになにをすれば1~16までの表示をさせることができるかわかりません。

『やり投げみたいだ』という貴重な意見をいただいたので、修正して、どこがわからないかを具体的に書かせていただきます。

【いまわかっていること】
1~10までの表記の仕方はわかってます。
1が初項のためi=1, 10以下のためi<=10, そして一つずつあがるからi++だという理論はわかるのですが、

【考えてみたこと&いまわからないこと】
1,2,4,7,11,16の場合、
an{1,2,4,7,11,16}から
bn{1,2,3,4,5}と見出し
そこからb=nという公式を出しそこからさらにan=1+1/2n^2+1/2nというところまで求めたのですが、これを活用してresultStrで求める方法を試したのですが

for(i=1; i<=16; i??)の??の部分に

for(i=1; i<=16; i+=1+1/2n^2+1/2n)と実行しても赤い下線部がでて実行ができませんでした。
またjavaで二乗が使えるのかどうかということを調べたのですが、出来ないみたいで、どのように展開するのがいいのか困っている状況です。

アドバイス頂けると幸いです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

y_waiwai

2020/04/26 06:31

質問は編集できます 追記修正しましょう
se_hatena2525

2020/04/26 06:38

質問の内容が表示されていませんでした。ありがとうございます。いま編集しました。
退会済みユーザー

退会済みユーザー

2020/04/26 23:31

10未満は含まないよ
se_hatena2525

2020/04/26 23:49

修正しました。ありがとうございます。
guest

回答2

0

ベストアンサー

等差数列ならコードが書けますか?

初項が 7 で、公差が 3 の等差数列の先頭 6個を表示するコードを書いてくれれば、
質問の階差数列のコードを書くための詳細な説明を差し上げましょう。

追記

コンパイル可能はコードは書いてもらえなかったようです。
全角文字の「”」を使ったり、resultStr = i; のように int を String に
変換できないコードを書いたりしています。

事情はわかりました。
Androidアプリを作っているので、main も System.out.println も使わない
ということですね。

でも、単純なコードを確かめるためにも Java の基本コードを使ってください。

やり方を 2通り示します。

Java

1class Main { 2 public static void main(String[] args) { 3 String s = callSubject01(); 4 System.out.println(s); 5 6 s = callSubject02(); 7 System.out.println(s); 8 } 9 10 private static String callSubject01() { 11 String resultStr = ""; 12 int a = 1, d = 1; 13 for (int i = 0; i < 6 ; i++) { 14 resultStr += a + " "; 15 a += d; 16 d++; 17 } 18 return resultStr; 19 } 20 21 private static String callSubject02() { 22 String resultStr = ""; 23 for (int i = 0; i < 6 ; i++) { 24 int a = (i*i + i + 2) / 2; 25 resultStr += a + " "; 26 } 27 return resultStr; 28 } 29}

追記2
すみません。詳細な説明なしにコードを提示してしまいました。
詳細な説明は se_hatena2525 さんにお任せします。
疑問点は質問してください。

追記3

(i*i + i + 2) / 2 ←このようにシンプルにまとめる方法があったのかと感心しました。

i*(i+1) / 2 + 1 と書いても同じです。

1 + (1/2)(nn) + (1/2)*n と書くと間違いです。
1/2 は整数の割り算なので、結果は 0.5 ではなく 0 だからです。

1 + n*n/2 + n/2 と書くのも間違いです。
n が奇数の時、割り切れず、端数の 0.5 が切り捨てられるからです。

いまいち、どういうことが行われてるのか理解できていません。

a += d; d++; が分からないのですか?

a = a + d;
d = d + 1;
と書き換えたら分かりますか?
数列の次の項 a は現在の項 a に公差 d を加えたものであり、
公差 d は 1 増やします。階差数列なので。

投稿2020/04/26 18:13

編集2020/04/27 18:54
kazuma-s

総合スコア8224

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

se_hatena2525

2020/04/26 23:30

an=a1+(n-1)d よってこの場合、an=7+6n-6=6n+1となります。そして6項目は、37なので、コードは、 for (int i=7; i<=37; i+=7){ resultStr= i; } return resultStr; …になると思われますがいか賀でしょうか?
kazuma-s

2020/04/26 23:44

表示も含めて、コンパイルできるコードをお願いします。
se_hatena2525

2020/04/26 23:56

交差3でした。すいません。 訂正したのが以下のコードです。 private String callSubject01(){ String resultStr “ “; for (int i=7; i<=22 ; i+=3){ resultStr= i; } return resultStr; } 表示されたのが71013161922です。
kazuma-s

2020/04/27 00:02

Java では、メソッドはクラスの中にしか書けません。 実行するには mainメソッドが必要です 表示するには Sysytem.out.println などを使います。 コンパイルできるコードをお願いします。
se_hatena2525

2020/04/27 15:23 編集

public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstnceState); setContentView(R.layout.activity_main); String result= callSubject() Textview tvResult= findViewById(R.id.tv_result); tvResult.setText(result); } private String callSubject01(){ String resultStr “ “; for (int i=7; i<=22 ; i+=3){ resultStr= i; } return resultStr; } } です。System.out.printlnは利用していません。
se_hatena2525

2020/04/28 00:14 編集

ご丁寧にありがとうございます。 どちらも試してみて実行されました。 2()のやり方は自分が考えていたことです。何故出来なかったか原因を挙げるならば二つあります。 まず【一つ目】はfor文の特徴を理解していなかったことです。for(i=x; x<i; i++)の『i++』のところに階差数列の公式を当てはめようとしてたことです。 あくまでもfor文の3つ目は変数iの中身にどれだけを足すよということなので実際に出力されるものではないということを頭の中で整理しきれてなかったです。 【二つ目の原因】は、an{1,2,3,4,7,11,16}のanを求める公式を1+1/2n^2+1/2nと正確に求めることができていたのにも関わらずそれをコードに書くとき1+{1/2(n*n)}+1/2*(n)とわかりずらく不正確な形にしてしまったことです。 kazuma-sさんのコードをみて(i*i + i + 2) / 2 ←このようにシンプルにまとめる方法があったのかと感心しました。 次回から応用させていただきます。 別件で一番最初に提示していただいたコードは発想になかったです。 String resultStr = ""; int a = 1, d = 1; for (int i = 0; i < 6 ; i++) { resultStr += a + " "; a += d; d++; } ★ i*(i+1) / 2 + 1 と書いても同じです。 1 + (1/2)*(n*n) + (1/2)*n と書くと間違いです。 1/2 は整数の割り算なので、結果は 0.5 ではなく 0 だからです。 1 + n*n/2 + n/2 と書くのも間違いです。 n が奇数の時、割り切れず、端数の 0.5 が切り捨てられるからです。 ⭐︎小数点を考慮するのが、ここでは大事なんですね。わかりやすい解説ありがとうございます。 ★いまいち、どういうことが行われてるのか理解できていません。 a += d; d++; が分からないのですか? a = a + d; d = d + 1; と書き換えたら分かりますか? 数列の次の項 a は現在の項 a に公差 d を加えたものであり、 公差 d は 1 増やします。階差数列なので。 ⭐︎ a = a + d d= d + 1と考えたらスッキリしました。 a+=d だと a+dでその答えがdになるという勘違いをしてました。 処理されるデータは”a”のため i=0回目のとき a=1が実行され i=1回目のとき a= a+=d = a+d= (1+1) = 2 i=2回目のとき a=2で d++ →1+1(公差が上がると同時にaの値も上がるため) よって 2 + 1+1= 4 i=3回目のとき a=4で 前回と同様に公差が+1されるので1+1+1になり よって答えはa+=d→ a = 4 + 3 =7… と繰り返させる訳ですね。 ようやく理解ができました。 ややかしかしていた要因は 【aとdがごちゃまぜになっていたの】 と ①resultStr = a + “ “ ; ②a+=d; ③d++ と頭の中で考え① ② ③を同時に一気に処理されるものだと捉えていたためです。 これだと ① 1 で ② 1+1=2 で ③ 1+1=2で ん?? と頭の中が??でした。 実際にはプログラム上 a1=1が先に処理され、 次にa2の項にdの公差が加算され、 そのまた次の項a3はa2にd++(1つ前の公差に+された公差)が加わるイメージですね。 頭ではわかっていてもどのように処理されるのかなど理解していないと難しいものです。個人的な感想としては。 本当に丁寧な解説ありがとうございました。
guest

0

まず、どういう計算式を使えばその数値、数列を出すことができるでしょうか。
まずはそこから考えていきましょう。

投稿2020/04/26 06:41

y_waiwai

総合スコア88042

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

se_hatena2525

2020/04/26 14:24

an{ 1,2,4,7,11,16}のanを求める式は1+1/2n^2-1/2nとわかったのですが、 これを仮に for(i=1; i<=16; i +++ 1/2n^2-1/2n) として実行されるのかどうかが、またどう変換すればいいのかが理解できず困ってます。
y_waiwai

2020/04/26 14:54

int sum=1; for( int i=0;i<16;i++){ sum+=i; System.out.printf("%d\n",sum);} でどーでしょう
se_hatena2525

2020/04/26 15:12

申し訳ございません。 String result Str= “ “;で宣言をしていて int sum= 1; for(int i = 0; i<=16 ; i++){ sum+=i resultStr+= (“%d/n”, sum) ;としても,とsumに赤の下線部がついてしまい実行できません。
swordone

2020/04/26 15:23

提示されたコードを魔改造して自分ルールを貫こうとするのは何なのでしょう。
se_hatena2525

2020/04/26 15:32

申し訳ございません。初心者で、何がどうやらわからず、困っております。System.out.printlnの方法でと自分で言ったのにもかかわらずresultStrでした。違う出力方法だと中のコードも変わると知りませんでした。情けないです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問