blue-phoenix
@blue-phoenix

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

javaの数列について

Q&A

Closed

5つの数nを並べたa{5,4,3,2,1}があるとき、1が何番目にあるのか求めたいのですが上手に出力できません。

int n = 5;
int[] a = new int[]{5,4,3,2,1};
for (int i = 0; i < n; i++) {
a[i] = sc.nextInt();

}
int ans = 0;
for(int x = 0; x < n; x++){
if(ans == 1){
    ans = a[x - 1];
    }
}
System.out.println(ans);
}
}

結果はそのまま見て5番目ですが、どうしても0と出てしまいます。
ifで1と等しい場合を書くところは分かりますが、下の記述がつかみとれていません。
配列は0番目から始まるので1を引くはずで、ansを表示されると思いますが色々と不審です。
この辺りをぜひ御教授下さい。

0

3Answer

4行目のコードa[i] = sc.nextInt();で何を入力しているのでしょうか?
2行目のコードint[] a = new int[]{5,4,3,2,1};で配列を初期化しているので、2〜5行目は不要では?

配列は0番目から始まるので1を引くはずで

それは、添え字の変数が1から始まっている場合です。
7行目のfor文の変数xは0から始まっているので、-1は不要で、逆に答えは1番目から数えるので、+1が必要です。

ifで1と等しい場合を書くところは分かりますが

比較する対象が違います。

for(int x = 0; x < n; x++) {
    if(a[x] == 1) {
        System.out.println(x + 1);
    }
}

図を書いて考えましょう。

2Like

Comments

  1. @blue-phoenix

    Questioner

    できました、またまた御指摘感謝します。
    補足ですが、後もう1つおうかがいしたい事があります。
    今回はint ans = 0;を書かなかったですが、これを使うケースが上手につかめていないです。この問いは5つの中で1つだけの数を抽出するので使わなかったのは他の問題で
    察知しましたが、前回の数列の和などああいった場合で何故書くのかそこだけ教えていただきたいです。
  2. @blue-phoenix

    Questioner

    言葉で言いづらいですがプログラミングの世界は基本0,1の判別で表す。
    というのは分かりますが、書かないケースもあったりそこいらの境目がろくにつかめきれなくて・・・。これが理解できればステップが上がれそうな気がします。

今回はint ans = 0;を書かなかったですが、これを使うケースが上手につかめていないです。
前回の数列の和などああいった場合で何故書くのか

早い話,元の数列を破壊せずに総和を求めるにはどうすんべ?てことですね.
ほとんどのプログラミング言語において,配列の中身を片っ端から見るには,今回も使用したようなforループを使用するわけですが,こいつは1つずつ要素を順番に処理することしか基本的にできません.
となるとi番目までの総和をひとまず保存しておく場所が必要です.int ans = 0;の意味するところはansという変数を宣言して初期化するというのは言うまでもありませんが,あとはそういうことです.

言葉で言いづらいですがプログラミングの世界は基本0,1の判別で表す。

とりあえず,日常でそんな低レベルでの管理が必要なアセンブリ言語を触る機会はそうそうないでしょうから,いったんそのイメージについては深く考えないでください.最低限,メモリ確保のされ方やポインタ・参照の概念が理解できていれば十分です.

まあとりあえず細かいところを気にする前に,言語仕様を正しく把握されるのが先かとは思います.

1Like

Comments

  1. @blue-phoenix

    Questioner

    材料となる部分を先に書いて答えのためにansなどを書く。
    「元の数列を破壊せずに」・・・それで和を求めたりAB範囲などを求めたりするための一系統、手段なんですね。自分はまだそこがなっていなかった。
    プログラミングを始めて2週間、もっと経験を積む必要があります。
    助言ありがとうございました、フォローに入れておきます!

今回はint ans = 0;を書かなかったですが、これを使うケースが上手につかめていないです。

特に決まりがある訳ではなく「必要だから使う」感じです。@Vercleneさんの回答にもありましたが、ループ内で処理した「途中経過の保持」みたいな意味合いです。

今回の問題でも使えましたが、指摘箇所がそこではなかったので、あえて消しました。使うと↓こんな感じです。今回はこれでも正しい答えが得られます。

int ans = 0;
for(int x = 0; x < n; x++) {
    if(a[x] == 1) {
        ans = x + 1;
    }
}
System.out.println(ans);

なお、
問題文が数列{5,4,3,2,1}であれば、どちらでも同じ結果になります。しかし、数列内に1が複数登場する場合は、出力結果が違ってきます。最初に提示したコードですと、1を見つける度に出力するのに対し、すぐ上のコードだと、最後に見つけた1の位置だけを出力します。
どんな課題でどんな制約があって、どういう出力を期待しているかで、コードの書き方も変わってきます。
int ans = 0;を書くか書かないかでは無くて、必要があれば「書く(使う)」ということです。

1Like

Comments

  1. @blue-phoenix

    Questioner

    ansで一度初期化する必要性は場合による事で、そこは結局経験を積んで慣れるのみですね。高難易度の問題を少し見ましたが、記述しているところもよくありました。道のりはまだ長そうです、次からはもっと慎重に学ぶようにします。
    今回もありがとうございました!

Your answer might help someone💌