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

解決済

回答 3

投稿

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

退会済みユーザー

 前提・実現したいこと

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 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

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

    キャンセル

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

  • ただいまの回答率 90.21%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

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