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

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

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

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

Java

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

while

Whileは多くの言語で使われるコントロール構造であり、特定の条件が満たされる限り一連の命令を繰り返し実行します。

Q&A

解決済

2回答

510閲覧

while文やfor文を用いた繰り返しに関するプログラムについて。

yoritomo

総合スコア7

for

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

Java

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

while

Whileは多くの言語で使われるコントロール構造であり、特定の条件が満たされる限り一連の命令を繰り返し実行します。

0グッド

0クリップ

投稿2021/05/06 18:29

「A=1を何倍ずつしていくと5回目に10000を超えるか」
という問いに対するプログラムを作りたいのですが、以下の様に書いたら「5」と表示されてしまい、上手く行きませんでした。

まず考え方としては、nの5乗が10000を超える時のnの値を出力する為に、for分の方ではiが1〜5までnのべき乗を繰り返すプログラムを作成し、それにwhile文で「Aが10000以下の条件」をつけ、nの値を+1ずつ増やして判定し続け、最終的にAが10000を超えた時点でのnを出力するプログラム書いたつもりです。

どこが間違っていて何を訂正すれば良いのかヒントやアドバイスなどをご教授いただければ幸いです。
お願いいたします。

public static void main(String[] args) { int n=1 ; //n^5の底を1としてスタート int A=1;//A=1からスタート while(A<=10000) { for(int i=1;i<=5; i++) { A=A*n;//このfor文でn^iをiが1〜5まで5回繰り返す } n++;//for文で繰り返したn^5をn=1から始めて+1し続けて、Aが10000以下になるか判定 } System.out.println(n);//n^5の底であるnの値を出力 }}

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

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

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

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

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

hoshi-takanori

2021/05/06 19:19

n を増やしても A の値はそのままですが、大丈夫でしょうか?
yoritomo

2021/05/06 19:36

回答ありがとうございます。 そうなのですか… 何故Aの値はそのままになってしまうのでしょうか? このままではfor文の中身がwhile文と連結(?)してないのでしょうか? アドバイスいただければ幸いです。
hoshi-takanori

2021/05/06 19:40

A をどこで 1 にするかの問題です。
yoritomo

2021/05/06 19:53 編集

ご指摘の通り、while文に A=1とを書いたところ、7と表示されました。 実行結果自体は合ってると思うのですが、コードはこちらで合ってるのでしょうか?… public static void main(String[] args) { int n=1 ; //n^5の底を1としてスタート int A=0 ; while(A<=10000) {    n ++;    A=1; for(int i=1;i<=5; i++) { A=A*n;//このfor文でn^iをiが1〜5まで5回繰り返す } } System.out.println(n);//n^5の底であるnの値を出力 }}
yoritomo

2021/05/06 20:00

無事動作確認が完了出来ました。 アドバイスありがとうございました。
guest

回答2

0

1回目の試行 A * n
2回目の試行 A * n^2
・・・
5回目の試行 A * n^5
とする時、A * n^5が10000未満なら、nの値を+1して再度1回目から試行する。
ということですね?

質問への回答

for文が終了し、while文の条件を満たさないとき、再度試行を行いますが。
その際に、A = A * n^5の最後の試行の代入結果が残ってしまっています。

つまり、
n = 2の時のAの開始値が、n = 1の時のAの最終値となっており、
A = 1で開始されていない為、予想の値となっていない、ということだと思います。

while文の開始の最初、for文実行前にA = 1と代入しAをリセットする必要があります。

public static void main(String[] args) { int n=1 ; //n^5の底を1としてスタート int A=1; //A=1からスタート while(A<=10000) { A = 1;//試行する場合は、Aをリセットする for(int i=1;i<=5; i++) { A=A*n;//このfor文でn^iをiが1〜5まで5回繰り返す } n++;//for文で繰り返したn^5をn=1から始めて+1し続けて、Aが10000以下になるか判定 } System.out.println(n);//n^5の底であるnの値を出力 }
自己解決への指摘

A = 1をfor文の前に記載する理由は、先に記載した通りです。
n++;はfor文の後でも前でもよいのですが、前に記載する場合は、
nの初期化宣言時にn = 0で初期化する必要があります。
int n = 1;で宣言し、for文の前にn++;が記載されている場合、
一番最初の試行はn = 2で行われます。
n = 1の時の試行を行っていないことに注意して下さい。

今回はAの初期値がA = 1のみで、n = 1は必ず答えとならない為に問題になっていませんが、
Aの開始値も+1して順に検査していく、というような時、
n = 1の試行を行っていないのは致命的です。

public static void main(String[] args) { int n=0 ; //試行開始前に+1する為、0で初期化。試行はn=1から行う。 int A=1; //A=1からスタート while(A<=10000) { n++; //n=1から順に試行を行う A = 1;//試行する場合は、Aをリセットする for(int i=1;i<=5; i++) { A=A*n;//このfor文でn^iをiが1〜5まで5回繰り返す } n++;//for文で繰り返したn^5をn=1から始めて+1し続けて、Aが10000以下になるか判定 } System.out.println(n);//n^5の底であるnの値を出力 }

投稿2021/05/11 18:22

編集2021/05/11 18:36
tori-taro

総合スコア6

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

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

0

自己解決

自己解決なのかどうか分かりませんが、この様に書き換えたところ、正しく実行されました。
```ここに言語を入力

public static void main(String[] args) {
int n=1 ; //n^5の底を1としてスタート
int A=0 ;
while(A<=10000) {
n ++;
A=1;
for(int i=1;i<=5; i++) {
A=A*n;//このfor文でn^iをiが1〜5まで5回繰り返す
}

}
System.out.println(n);//n^5の底であるnの値を出力
}}

投稿2021/05/06 20:12

編集2021/05/07 03:20
yoritomo

総合スコア7

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

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

YT0014

2021/05/07 00:39

回答欄においても、コードはマークダウン形式での記述をお願いします。
yoritomo

2021/05/07 03:22

変更しました。 因みに何故でしょうか?
YT0014

2021/05/07 07:22

直接の記述の場合、インデントが崩れたり、意図しないマークダウンにより、正確でないコードになったりするためです。 老婆心ながら付け加えますと、yoritomoさんも、コードの誤りを減らすためにも、正確なインデントを行うよう努められた方が良いかと思います。
tori-taro

2021/05/11 18:37 編集

自己解決コードで1点問題点を見つけたので、解決済みの質問ですが、改めて解決した理由とともに回答をつけてみました。 n++;をfor文の前に記載する場合は、nの初期化をn = 0としないと、n = 1の時の試行が行われていません。(今回は問題ありませんが)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問