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

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

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

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

Q&A

解決済

3回答

3908閲覧

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

退会済みユーザー

退会済みユーザー

総合スコア0

Java

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

0グッド

0クリップ

投稿2018/04/17 16:12

前提・実現したいこと

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

問題文

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

制作途中のソースコード

Java

1import java.io.*; 2 3public class Ensyu5_B{ 4 public static void main(String[] args) throws IOException{ 5 BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); 6 7 int [] intVal = new int [2]; 8 int sum0 = 0; 9 int sum1 = 0; 10 int sum; 11 int i; 12 String str0 = br.readLine(); 13 String str1 = br.readLine(); 14 15 intVal[0] = Integer.parseInt(str0); 16 intVal[1] = Integer.parseInt(str1); 17 18 for(i = 1; i <= intVal[1]; i += 2){ 19 System.out.println("奇数\t" + 1); 20 } //奇数の間の数 21 22 for(i = 0; i <= intVal[0]; i += 2){ 23 System.out.println("偶数\t" + 1); 24 } //偶数の間の数 25 26 for(i = 1; i <= intVal[1]; i += 2) 27 sum1 += i; 28 //奇数の合計 29 30 for(i = 0; i <= intVal[0]; i += 2) 31 sum0 += i; 32 //偶数の合計 33 34 System.out.println(sum1); 35 System.out.println(sum0); 36 37 } 38 39} //end 40 41 42 43

実行結果とやりたいこと

<実行画面>
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"

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

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

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

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

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

guest

回答3

0

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

java

1import java.io.BufferedReader; 2import java.io.IOException; 3import java.io.InputStreamReader; 4 5public class Ensyu5_B { 6 public static void main(String[] args) throws IOException { 7 BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); 8 String str; 9 10 str = br.readLine(); 11 int a = Integer.parseInt(str); 12 str = br.readLine(); 13 int b = Integer.parseInt(str); 14 if (a > b) { 15 int t = a; 16 a = b; 17 b = t; 18 } 19 int[] sum = {0, 0}; 20 System.out.print("奇数:"); 21 for (int i = a; i <= b; i++) { 22 if (i % 2 == 1) { 23 System.out.print(" " + i); 24 sum[1] += i; 25 } 26 } 27 System.out.println(); 28 29 System.out.print("偶数:"); 30 for (int i = a; i <= b; i++) { 31 if (i % 2 == 0) { 32 System.out.print(" " + i); 33 sum[0] += i; 34 } 35 } 36 System.out.println(); 37 System.out.println("奇数の合計: " + sum[1]); 38 System.out.println("偶数の合計: " + sum[0]); 39 } 40} 41

イメージ説明

投稿2018/04/18 21:42

katoy

総合スコア22324

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

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

退会済みユーザー

退会済みユーザー

2018/04/19 14:04

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

0

ベストアンサー

こんにちは

Java

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

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

Java

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

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

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

Java

1 2import java.util.Scanner; 3import java.util.ArrayList; 4 5public class Main { 6 7 public static void main(String[] args) { 8 9 Scanner sc = new Scanner(System.in); 10 int num1 = Integer.parseInt(sc.nextLine()); 11 int num2 = Integer.parseInt(sc.nextLine()); 12 ArrayList <Integer> even = new ArrayList <>(); 13 ArrayList <Integer> odd = new ArrayList <>(); 14 int tmp; 15 if(num1 >= num2){ 16 tmp = num1; //最初のほうが大きかったら入れ替えます。 17 num1 = num2; 18 num2 = tmp; 19 } 20 int sum1 = 0; 21 int sum2 = 0; 22 23 for(int i = num1; i <= num2; i++){ 24 if(i % 2 == 0){ 25 even.add(i); 26 sum1 += i; 27 } 28 else{ 29 odd.add(i); 30 sum2 += i; 31 } 32 } 33 System.out.print("偶数:"); 34 for(int i = 0; i < even.size(); i++){ 35 System.out.print(even.get(i)); 36 if(i < even.size() - 1){ 37 System.out.print(","); 38 } 39 } 40 System.out.println(); 41 System.out.print("奇数:"); 42 for(int i = 0; i < odd.size(); i++){ 43 System.out.print(odd.get(i)); 44 if(i < odd.size() - 1){ 45 System.out.print(","); 46 } 47 } 48 System.out.println(); 49 System.out.println("偶数の和:" + sum1); 50 System.out.println("奇数の和:" + sum2); 51 } 52}

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

Java

1public class Sum { 2 3 public static void main(String[] args) { 4 5 Scanner sc = new Scanner(System.in); 6 int []num = new int[2]; 7 8 for(int i = 0; i < 2; i++){ 9 num[i] = Integer.parseInt(sc.nextLine()); 10 } 11 12 int tmp; 13 if(num[0] >= num[1]){ 14 tmp = num[0]; 15 num[0] = num[1]; 16 num[1] = tmp; 17 } 18 int []maxmin = new int[4]; //偶数の最小値、偶数の最大値, 奇数の最小値 、奇数の最大値 19 20 for(int i = 0; i < 4; i++){ 21 maxmin[i] = num[i % 2] + ruijou_1(i) * (num[i % 2] + i / 2) % 2; 22 } 23 int all = (num[1] + num[0]) * (num[1] - num[0] + 1) / 2; 24 int []sum = new int[2]; 25 sum[1] = ((maxmin[3] + 1) * (maxmin[3] + 1) - (maxmin[2] - 1) * (maxmin[2] - 1)) / 4; 26 sum[0] = all - sum[1]; 27 28 String []text = {"偶数:","奇数:"}; 29 30 for(int i = 0; i < 2; i++){ 31 System.out.print(text[i]); 32 for(int j = maxmin[i * 2]; j <= maxmin[i * 2 + 1];j++){ 33 if(j % 2 == i){ 34 System.out.print(j + " "); 35 } 36 } 37 System.out.println("合計値:" + sum[i]); 38 } 39 40 } 41 public static int ruijou_1(int n){ 42 if(n % 2 == 0){ 43 return 1; 44 } 45 else{ 46 return -1; 47 } 48 } 49}

投稿2018/04/17 23:22

編集2018/04/18 03:20
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

Zuishin

2018/04/18 00:42

ループとかリストとか要ります? 連続した数値なんだから一行の計算ですぐ出るような。 例えば 1 と 100 の間の奇数は 50 個ですし、その合計も 2500 と暗算できます。 あとこれだけ長い処理なら変数の命名で 1 とか 2 とかは避けた方がいいですね。 even のリストは evens で sum1 は sumOfEvens のようにすると読みやすくなります。 num1 num2 も lesser greater とか min max の方が。
退会済みユーザー

退会済みユーザー

2018/04/18 00:49

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

退会済みユーザー

2018/04/18 00:55 編集

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

2018/04/18 01:06 編集

チェックする必要などありません。(100 - 1) / 2 + 1 % 1 で出ます。
退会済みユーザー

退会済みユーザー

2018/04/18 01:01

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

2018/04/18 01:11 編集

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

退会済みユーザー

2018/04/18 01:16

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

2018/04/18 01:19

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

退会済みユーザー

2018/04/18 01:22

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

退会済みユーザー

2018/04/18 01:25

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

2018/04/18 01:29

先ほど書いた通り、ちゃんと考えず書いたので間違っています。 % 1 ではなく % 2 というところも間違っていますね。 奇数の場合は 2 で割ってあまりが 1 になります。 で、私はループを使わず簡単な計算で出るという主張ですが、あなたは簡単に式が書けないという主張ですか?
退会済みユーザー

退会済みユーザー

2018/04/18 01:36

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

2018/04/18 01:40

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

2018/04/18 01:47

そんなに言うなら回答に書けばいいのに
退会済みユーザー

退会済みユーザー

2018/04/18 02:15 編集

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

2018/04/18 02:11

最大値はn%2を引かなきゃだめじゃない?
退会済みユーザー

退会済みユーザー

2018/04/18 02:16 編集

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

2018/04/18 02:57

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

2018/04/18 02:59

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

2018/04/18 03:05

その通りです。今日はちょっと間違いが多いですね。
退会済みユーザー

退会済みユーザー

2018/04/18 03:07

皆さんに指摘されたところをもとに書き直したものを載せました。
退会済みユーザー

退会済みユーザー

2018/04/18 14:18

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

0

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

投稿2018/04/17 16:17

swordone

総合スコア20651

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

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

退会済みユーザー

退会済みユーザー

2018/04/17 17:45

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問