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

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

ただいまの
回答率

90.34%

  • Java

    14423questions

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

Java:2つの入力値の間の偶数奇数の数と偶数奇数各々の合計の求め方

解決済

回答 3

投稿

  • 評価
  • クリップ 0
  • VIEW 1,396
退会済みユーザー

退会済みユーザー

 前提・実現したいこと

Javaの超初心者です。
とあるJavaの問題で困っています。下記が問題文となります。

 問題文

2つの数値をキーボードから入力し、小さい数値から大きい数値までの間の奇数の数と、偶数の数、奇数の合計と偶数の合計をそれぞれ画面に表示すること。

 制作途中のソースコード

import java.io.*;

public class Ensyu5_B{
    public static void main(String[] args) throws IOException{
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

    int [] intVal = new int [2];
    int sum0 = 0;
    int sum1 = 0;
    int sum;
    int i;
    String str0 = br.readLine();
    String str1 = br.readLine();

    intVal[0] = Integer.parseInt(str0);
    intVal[1] = Integer.parseInt(str1);

    for(i = 1; i <= intVal[1]; i += 2){
        System.out.println("奇数\t" + 1);
        }  //奇数の間の数

    for(i = 0; i <= intVal[0]; i += 2){
        System.out.println("偶数\t" + 1);
        }  //偶数の間の数

    for(i = 1; i <= intVal[1]; i += 2)
        sum1 += i;
        //奇数の合計

    for(i = 0; i <= intVal[0]; i += 2)
        sum0 += i;
        //偶数の合計

    System.out.println(sum1);
    System.out.println(sum0);

    }

} //end

 実行結果とやりたいこと

<実行画面>
10
8
奇数 1
奇数 3
奇数 5
奇数 7
偶数 2
偶数 4
偶数 6
偶数 8
偶数 10
奇数の合計=16
偶数の合計=30

入力値の10のみの偶数、8のみの奇数とそれぞれのみの偶数奇数の合計がでてしまっている状況です。
作成したいプログラムとしては、入力した2つの数値の間の個数(例:2つの入力した数値が 8,  10 →8から10の間の数値 8 9 10)を偶数と奇数で出力(例:奇数 9、偶数 8, 10)し、奇数の合計と偶数の合計をそれぞれ出力したい(例:奇数の合計=9,偶数の合計=18 )のです。
数日あれこれやってみましたがここから好転せず…恐らく原因はintVal[0]とintVal[1]の代入の仕方に問題があると思いますが、2つの入力した数値をどう活かせば良いのかがどうしても分かりません。助けてください。
解決にお力添えいただけると幸いです。何卒よろしくお願いいたします。

 補足情報(FW/ツールのバージョンなど)

Java
java version "1.8.0_161"

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

checkベストアンサー

+1

こんにちは

for(i = 1; i <= intVal[1]; i += 2){
        System.out.println("奇数\t" + 1);
        }  //奇数の間の数

    for(i = 0; i <= intVal[0]; i += 2){
        System.out.println("偶数\t" + 1);
        }  //偶数の間の数


これだと奇数のところは1から  偶数のところは0から 表示されてしまいます。
入力した2つの整数がとりうる値の範囲ならば

for(int i = intVal[0]; i <= intVal[1]; i++){
}


と書きましょう。
また、入力した値の大小も考え、最初のほうが大きい場合は入れ替える必要があります。

私が書いたソースコードを載せておきます。

import java.util.Scanner;
import java.util.ArrayList;

public class Main {

    public static void main(String[] args) {

        Scanner sc = new Scanner(System.in);
        int num1 = Integer.parseInt(sc.nextLine());
        int num2 = Integer.parseInt(sc.nextLine());
        ArrayList <Integer> even = new ArrayList <>();
        ArrayList <Integer> odd = new ArrayList <>();
        int tmp;
        if(num1 >= num2){
            tmp = num1; //最初のほうが大きかったら入れ替えます。
            num1 = num2;
            num2 = tmp;
        }
        int sum1 = 0;
        int sum2 = 0;

        for(int i = num1; i <= num2; i++){
            if(i % 2 == 0){
                even.add(i);
                sum1 += i;
            }
            else{
                odd.add(i);
                sum2 += i;
            }
        }
        System.out.print("偶数:");
        for(int i = 0; i < even.size(); i++){
            System.out.print(even.get(i));
            if(i < even.size() - 1){
                System.out.print(",");
            }
        }
        System.out.println();
        System.out.print("奇数:");
        for(int i = 0; i < odd.size(); i++){
            System.out.print(odd.get(i));
            if(i < odd.size() - 1){
                System.out.print(",");
            }
        }
        System.out.println();
        System.out.println("偶数の和:" + sum1);
        System.out.println("奇数の和:" + sum2);
    }
}

皆さんに指摘されたところをもとに書き直したものを載せておきます。

public class Sum {

    public static void main(String[] args) {

        Scanner sc = new Scanner(System.in);
        int []num = new int[2];

        for(int i = 0; i < 2; i++){
            num[i] = Integer.parseInt(sc.nextLine());
        }

        int tmp;
        if(num[0] >= num[1]){
            tmp = num[0];
            num[0] = num[1];
            num[1] = tmp;
        }
        int []maxmin = new int[4]; //偶数の最小値、偶数の最大値, 奇数の最小値  、奇数の最大値

        for(int i = 0; i < 4; i++){
            maxmin[i] = num[i % 2] + ruijou_1(i) * (num[i % 2] + i / 2) % 2;
        }
        int all = (num[1] + num[0]) * (num[1] - num[0] + 1) / 2;
        int []sum = new int[2];
        sum[1] = ((maxmin[3] + 1) * (maxmin[3] + 1) - (maxmin[2] - 1) * (maxmin[2] - 1)) / 4;
        sum[0] = all - sum[1];

        String []text = {"偶数:","奇数:"};

        for(int i = 0; i < 2; i++){
            System.out.print(text[i]);
            for(int j = maxmin[i * 2]; j <= maxmin[i * 2 + 1];j++){
                if(j % 2 == i){
                    System.out.print(j + " ");
                }
            }
            System.out.println("合計値:" + sum[i]);
        }

    }
    public static int ruijou_1(int n){
        if(n % 2 == 0){
            return 1;
        }
        else{
            return -1;
        }
    }
}

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/04/18 09:42

    ループとかリストとか要ります?
    連続した数値なんだから一行の計算ですぐ出るような。
    例えば 1 と 100 の間の奇数は 50 個ですし、その合計も 2500 と暗算できます。

    あとこれだけ長い処理なら変数の命名で 1 とか 2 とかは避けた方がいいですね。
    even のリストは evens で sum1 は sumOfEvens のようにすると読みやすくなります。
    num1 num2 も lesser greater とか min max の方が。

    キャンセル

  • 2018/04/18 09:49

    例えば入力された数字が5,8の時
    偶数:6,8
    奇数:5,7
    のように表示しなければいけないのでリストを使いました。
    配列でもよかってけどそれだと偶数、奇数をそれぞれ数える変数countを用意しなければいけないので
    このような形になりました。

    キャンセル

  • 2018/04/18 09:54 編集

    それと、「例えば 1 と 100 の間の奇数は 50 個ですし、その合計も 2500 と暗算できます。」
    について、最初の数が1ならがこっちのほうが簡単ですが、それ以外の時は
    偶数と奇数 それぞれの最小値、最大値を求める必要があります。
    そのためには入力された数が偶数か奇数かいちいちチェックする必要があるのです。
    そっちのほうが面倒です。

    キャンセル

  • 2018/04/18 09:56 編集

    チェックする必要などありません。(100 - 1) / 2 + 1 % 1 で出ます。

    キャンセル

  • 2018/04/18 10:01

    ?? すいません。最後1で割った余りを出すところがわかりません。

    キャンセル

  • 2018/04/18 10:07 編集

    100 % 1 でなく 1 % 1 の打ち間違いでした。
    奇数で始まる時は奇数の数が多くなるからです。
    1 から 3 の 3 つの場合奇数の数は 2 ですが、2 から 4 の 3 つの場合は奇数の数は 1 です。
    最初が奇数なら 1 足すことで奇数の数が出ます。
    偶数の数はその逆ですが、全体の数から奇数の数を引けばいいでしょう。

    キャンセル

  • 2018/04/18 10:16

    1で割った余りは常に0なので1%1は0になりますがそれを加える必要があるのでしょうか?

    キャンセル

  • 2018/04/18 10:19

    定数なので定数の答えが出ますが、実際は変数に対して演算します。
    ただこの計算式は 100 と 1 の場合は成り立ちますが、よく考えずに書いたので式自体は間違っています。しかし考え方は同じなので簡単に一般化できるでしょう。

    キャンセル

  • 2018/04/18 10:22

    (100 - 1) / 2 + 1 % 1 = 49となりますがこの49が何を指しているのかがわかりません

    キャンセル

  • 2018/04/18 10:25

    あと、これを使って個数を出すのはわかったのですが、和を求めるのはまた別の話だと思います。
    「例えば 1 と 100 の間の奇数は 50 個ですし、その合計も 2500 と暗算できます。」について
    最初の数が1ではないとき、奇数が50個だからと、合計が2500となるわけではないです。
    ここらへんのコードが少し複雑になるので単純に足すことにしました。

    キャンセル

  • 2018/04/18 10:29

    先ほど書いた通り、ちゃんと考えず書いたので間違っています。
    % 1 ではなく % 2 というところも間違っていますね。
    奇数の場合は 2 で割ってあまりが 1 になります。

    で、私はループを使わず簡単な計算で出るという主張ですが、あなたは簡単に式が書けないという主張ですか?

    キャンセル

  • 2018/04/18 10:36

    はい、そうです。個数を出すのはZuishinさんが書いた式のほうが簡単なのでいいのですが
    和を求めるところで式で書こうとするとΣの公式で求めるので
    偶数・奇数 それぞれの最小値 最大値を求める必要があると思います。
    最小値 最大値を求めずに和を出力する方法があるのでしょうか?

    キャンセル

  • 2018/04/18 10:40

    例えば最小値が n であるならば奇数の最小値は n + (n + 1) % 2 になります。
    最大値も同様の考え方で出ます。
    簡単ではありませんか?

    キャンセル

  • 2018/04/18 10:47

    そんなに言うなら回答に書けばいいのに

    キャンセル

  • 2018/04/18 11:07 編集

    なるほど!! そう書けばいいのですね
    それだと奇数の最小値、最大値はn + (n + 1) % 2で
    偶数の最小値、最大値は n + n % 2で求めて
    個数は (最大値 - 最小値) / 2 + 1で求めたほうが簡単ですね。
    そして和を求めるときは それをもとにΣ計算すればいいということですか?

    キャンセル

  • 2018/04/18 11:11

    最大値はn%2を引かなきゃだめじゃない?

    キャンセル

  • 2018/04/18 11:15 編集

    すいません 「引く」 でした.
    最大値の時は 奇数:n - (n + 1) % 2 偶数: n - n % 2でした.

    キャンセル

  • 2018/04/18 11:57

    そこまで言うつもりはなかったんですよ。O(n) が O(0) でできますよと一言だけのつもりでした。宿題だと思うので回答はしません。

    キャンセル

  • 2018/04/18 11:59

    O(0)じゃなくてO(1)ですね

    キャンセル

  • 2018/04/18 12:05

    その通りです。今日はちょっと間違いが多いですね。

    キャンセル

  • 2018/04/18 12:07

    皆さんに指摘されたところをもとに書き直したものを載せました。

    キャンセル

  • 2018/04/18 23:18

    こんばんは、返信及び確認が遅くなりまして申し訳ないです…!
    また、こんなにご丁寧に回答いただいて本当に助かります、ありがとうございます!
    まだまだ初心者故、最も今の自分でも理解できるよう記述してくださったStars1024さんにベストアンサーをお贈りしたいと思います。
    また、回答やコメント等一緒に考えてくださった皆様にもこの場を借りて御礼申し上げます。
    この度は大変勉強になりました、ありがとうございました!

    キャンセル

+1

2つの数の「間」なのですから、for文のスタートとゴールの値をその2つの数にしなければいけません。
スタートを0または1で固定してしまっているため、この問題が起きています。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/04/18 02:45

    早速のご回答いただきありがとうございます…!
    for文のスタートとゴールが2つの入力値になっていないとのご指摘に、成る程と解決の糸口が見えた心地です。
    for(i = 1; i <= intVal[1]; i += 2) の箇所がやはり問題だったのですね…
    また初歩的な質問で恐縮なのですが、スタートとゴールが問題という点でiの値に現在設定している0,1から入力値のintVal[0],intVal[1]に変更したところ、奇数のみ表示されたり表示された数値が全て1だったりと、どうにも記述の仕方が間違えているようでうまくいかず…お手数をおかけしてしまい大変恐縮ですが、問題のfor文のプログラムの書き方をお教え願えませんでしょうか…?

    キャンセル

+1

java 入門の初期の基本で書くようにしてみました。

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Ensyu5_B {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String str;

        str = br.readLine();
        int a = Integer.parseInt(str);
        str = br.readLine();
        int b = Integer.parseInt(str);
        if (a > b) {
            int t = a;
            a = b;
            b = t;
        }
        int[] sum = {0, 0};
        System.out.print("奇数:");
        for (int i = a; i <= b; i++) {
            if (i % 2 == 1) {
                System.out.print(" " + i);
                sum[1] += i;
            }
        }
        System.out.println();

        System.out.print("偶数:");
        for (int i = a; i <= b; i++) {
            if (i % 2 == 0) {
                System.out.print(" " + i);
                sum[0] += i;
            }
        }
        System.out.println();
        System.out.println("奇数の合計: " + sum[1]);
        System.out.println("偶数の合計: " + sum[0]);
    }
}


イメージ説明

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/04/19 23:04

    コメントが遅くなってしまい大変失礼いたしました、ご回答くださるだけでなく現在の私のレベルに合わせてお教えいただきありがとうございます…!
    まだまだ入門者で至らない箇所ばかりですが、お教えいただいたこと、大変勉強になります。
    自分でひらめくことまで至らなかった問題でしたので本当に助かりました、改めましてありがとうございました!

    キャンセル

同じタグがついた質問を見る

  • Java

    14423questions

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