LoginSignup
blue-phoenix
@blue-phoenix

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

整数と配列の違いについて

2種類の問題についてお聞きしたい事があります。
整数と配列の記述についてちょっと不審なところがあるので教えてほしいのですが。

ある整数n が与えられる時、1 から n までの 1 ずつ増加する数列の和を出力せよ。
int n = sc.nextInt();
int[] a = new int[n];
int ans = 0;
for (int i = 0; i <= n; i++) {
ans += i;
}
System.out.println(ans);

長さn の数列 a (a_1, a_2, ..., a_N) が与えられる時、
この数列の和を計算し、出力せよ。
int n = sc.nextInt();
int[] a = new int[n];
for (int i = 0; i < n; i++) {
  a[i] = sc.nextInt();
}
int ans = 0;
for (int x : a) {
ans += x;
}
System.out.println(ans);

簡単な問いで、もはや恒例となったansを初期化して書いてます。
nが20の時、答えはどちらも210となりますが、一応上の2つは正解となっています。
しかし、記述が異なって例えば上の問いを下のコードで書いてもエラーになり、その逆でもエラーになります。
理由はもちろん整数と配列の違いだと思いますが、1~20という定義は同じで
計算方法は結局同じじゃないのかと疑っています。
・上でa[i]がなくてもなぜ正解となれたのか?
・なぜ上だけ<=にしなければならないのか?
・なぜ上で拡張for文にしてはいけないのか?
こういった点が未だに吸収されていないので是非御教授お願いします。

0

2Answer

・上でa[i]がなくてもなぜ正解となれたのか?

配列aは定義しているだけで、値も設定しておらず、未使用の変数であるため。

・なぜ上だけ<=にしなければならないのか?

変数iの値をansに加算しているので、20まで加算する必要があるため。0は加算しても答えは変わらない。

・なぜ上で拡張for文にしてはいけないのか?

配列aは値を設定しておらず、もし、拡張for文で参照すると、値はどれも0であるため。

2

Comments

  1. @blue-phoenix

    Questioner
    配列は元々宣言文の状態では何も数値がないんですね。
    そういえば拡張forにしたら確かに結果が0になってました。
    要は+=して始めて数値が出るんですね、いつも素早き教えに感謝します!

nが20の時、答えはどちらも210となりますが、一応上の2つは正解となっています。
しかし、記述が異なって例えば上の問いを下のコードで書いてもエラーになり、その逆でもエラーになります。

まず、前提が間違っています。

前者は「1からnまでの和」
後者は「要素数がnである配列に入っている整数(今回の場合は入力した値)の和」
なので求められている結果が異なります。

それを踏まえて回答しますが、

・上でa[i]がなくてもなぜ正解となれたのか?

int[] aを定義しただけで、使用していない(必要ない)からです。

int[] aの定義を除いた下記のコードでも動作します。

import java.util.Scanner;

public class Main {
    public static void main(String[] args) throws Exception {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        
        int ans = 0;
        for (int i = 0; i <= n; i++) {
            ans += i;
        }
        System.out.println(ans);
    }
}

・なぜ上だけ<=にしなければならないのか?

配列は添え字が0から始まるからです。
int[] a = new int[5];と定義した場合、
a[0],a[1],a[2],a[3],a[4]の5個になるので
後者はi < nと添え字が4までで止まる(nを含まない)ようになっています。

上記に対し、前者は「1からn」までなので
「nを含む」必要があるからです。

・なぜ上で拡張for文にしてはいけないのか?

拡張for文は
「配列やコレクションの要素の数だけ繰り返しを行う」ものなので
前者の場合「してはいけない」というより
「書きようがない」ということになります。

1

Comments

  1. 自然数と整数問題でしょうか?
    ```
    n = 20
    for (int i = 1; i < n + 1; i++) {
    ans += i;
    }
    ```
    ゼロを足すことはロジックとして正しくないですが、結果オーライともいえます。

    因みに、関数型のプログラムでは
     n=20
     ans=(1+n)*n/2 です。
  2. @blue-phoenix

    Questioner
    ほ、ほ、ホントだ・・・a[]が無くてもエラーになりません。
    あっ、この(1+n)*n/2って等差数列の和の式!?
    ああああああああああ、この方法がありましたか!
    配列だからインデックスは必ず0から始まる・・・確かにそうでした。
    上は単なる整数の数だから1からでも良い・・・足りないのはここか。
    ほんの・・・わずかな、文の違いで・・・こんな。
    マーオ、また1つ勉強になりました感謝します。
    fol文に入れておきました!

Your answer might help someone💌