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

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

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

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

Q&A

解決済

5回答

2266閲覧

1からaまでの積を求めるプログラムがうまく動かない

Tazusa

総合スコア41

Java

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

0グッド

0クリップ

投稿2018/01/21 13:08

編集2018/01/21 13:14

Javaで1から入力した数までの積を求めるプログラムを作っています。
しかし、うまく動きません。
エラーは出ていないのですが、計算結果が異なってしまいます。
例えば3を入力すると2、5を入力すると24が出ます。
この結果からおそらく(a-1)までの積を表示しているのではと推測はしているのですが…

どの点のせいなのかご指摘お願いいたします。

import java.util.Scanner; public class Chap2 { public static void main(String [] args) { Scanner stdIn = new Scanner(System.in); int a; do { System.out.println("正の整数を入力"); a = stdIn.nextInt(); if (a < 1) { System.out.println("もう一度"); } } while (a < 1); int time = 1; int i = 1; do { time *= i; i++; }while (a != i); System.out.println("かけると" + time +"です"); } }

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

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

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

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

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

guest

回答5

0

この結果からおそらく(a-1)までの積を表示しているのではと推測はしているのですが…

そこまで分かっているなら、プログラムの実行を追えばいいと思うのですが。

かけ算するループのなかで、iを増やしてaと等しくなったときにループを抜けるので、そのiはかけ算の対象になっていません。
修正の一例としては、

Java

1int i = 0; 2 3do { 4 i++; 5 time *= i; 6}while (a != i);

投稿2018/01/21 13:20

otn

総合スコア84505

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

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

Tazusa

2018/01/21 13:28

int i =0; とするのは思いつきませんでした。 みなさんからご指摘いただいて、 }while (a != i); ではなく、 }while (a != (i -1)); と修正していました。 回答ありがとうございます。
guest

0

ベストアンサー

例えば3を入力した場合、
0. time *= iによりtimeは1
0. iをインクリメントして2
0. whileは2 != 3なので継続
0. time *= iによりtimeは2
0. iをインクリメントして3
0. whileは3 != 3が偽のため抜ける

このため、最後の3が掛け算できません。

投稿2018/01/21 13:18

swordone

総合スコア20651

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

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

Tazusa

2018/01/21 13:23

たしかに順を追って考えればおっしゃる通りでした。わかりやすく示していただきありがとうございました。
guest

0

time *= i; i++;

順番のせい

投稿2018/01/21 13:17

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

Tazusa

2018/01/22 11:59

ありがとうございます!
guest

0

繰り返し処理をする方法はいろいろあります。
"java 繰り返し" で google 検索してみてください。

以下のコードは、for や range をつかって書いています。

java

1import java.util.Scanner; 2import java.util.stream.IntStream; 3 4public class Chap2 { 5 public static void main(String[] args) { 6 Scanner stdIn = new Scanner(System.in); 7 int a; 8 do { 9 System.out.println("正の整数を入力"); 10 a = stdIn.nextInt(); 11 if (a < 1) { 12 System.out.println("もう一度"); 13 } 14 } while (a < 1); 15 16 int time = 1; 17 for (int i = 1; i <= a; i++) { 18 time *= i; 19 } 20 System.out.println("かけると" + time + "です"); 21 22 time = IntStream.rangeClosed(1, a).reduce(1, (value1, value2) -> { 23 return value1 * value2; 24 }); 25 System.out.println("かけると" + time + "です"); 26 } 27}

実行例
イメージ説明

参考

  • 従来の for ループに代わる関数型の手法

https://www.ibm.com/developerworks/jp/java/library/j-java8idioms3/index.html

投稿2018/01/21 14:23

katoy

総合スコア22324

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

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

Tazusa

2018/01/21 15:42

forやrangeを使う方法もあるのですね。参考にさせていただきます。詳しく説明してくださり、ありがとうございます。
guest

0

数が大きい場合はオーバーフローしやすい計算です。

小さい数字のうちはうまくいくはずですが、どうでしょう。

投稿2018/01/21 13:10

HogeAnimalLover

総合スコア4830

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

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

Tazusa

2018/01/21 13:16

すみません、具体例が抜けていました。例えば3を入力すると2、4を入力すると6、5を入力すると24が出ます。この結果からおそらく(a-1)までの積を表示しているのではと予想しています。 3のような小さい数でもうまく計算できていない原因がわからないです…
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問