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

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

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

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

Q&A

解決済

3回答

775閲覧

Javaの課題の計算がうまくいきません

hagre

総合スコア6

Java

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

1グッド

1クリップ

投稿2020/03/27 03:28

Java の課題をしているのですが、思うような計算結果が表示できません。
ピラミッドを形作る〇の数を計算したいです。
数列の公式を使って初項1、公差1の等差数列の和と考えて10項までの和をfor分を使って出力してみました。その結果、すべての部分で0が出力されてしまいます。


〇〇
〇〇〇
〇〇〇〇
#######################################
import java.util.Scanner;
public class Program{

public void input(){ Scanner scan = new Scanner(System.in);

}

public void compute(){

}

public void output(){
int b;
String str="Stage",str2=" pieces";
for(int a=1; a<=10; a++){
b=(1/2)a(1+a);

System.out.println(str+a+":"+" "+b+str2);
}
}

public static void main(String[] args){
Program p= new Program();
p.input();
p.compute();
p.output();
}
}
##########################################
[Program Output--------]
Stage1: 0 pieces
Stage2: 0 pieces
Stage3: 0 pieces
Stage4: 0 pieces
Stage5: 0 pieces
Stage6: 0 pieces
Stage7: 0 pieces
Stage8: 0 pieces
Stage9: 0 pieces
Stage10: 0 pieces
#############################################

DrqYuto👍を押しています

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

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

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

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

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

Wind

2020/03/27 03:39

ちょっと見ただけなのでここに記載します。 > b=(1/2) これが整数で0になっていませんか? また独自記法を勝手に作らず、Markdown記法を使用して書いてください。
hagre

2020/03/27 11:12

Windさん、ありがとうございます。 分数の形が通用すると思い込んでいたようです、、 Markdown記法というのも理解できるようにこれからも頑張りたいと思います。 大変助かりました。
退会済みユーザー

退会済みユーザー

2020/03/31 07:57 編集

> Markdown記法というのも理解できるように 質問にコードを記述するために必要なことです。 努力目標にしないで、すぐに覚える気持ちでいてください。
guest

回答3

0

b=(1/2)*a*(1+a); ^^^^^←ココが0となるから、そのあと何掛けてもコタエは0 b = a*(1+a)/2; // ってやってみ。

投稿2020/03/27 03:38

episteme

総合スコア16612

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

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

hagre

2020/03/27 11:21

epistemeさん、素早いご回答ありがとうございます。 小数点以下切り捨てのルールを忘れてしまっていました、、 短く、かつ分かりやすかったので大変参考になります。 私もこれから理解を深められるよう、頑張りたいと思います。
guest

0

ベストアンサー

既に答えはでているようですが出力値が想定外だった場合はもう少し小さく分けると良いと思います。

// int b=(1/2)a(1+a); ここが0になっているがなぜ0になるのか不明
int b1 = 1/2;
int b2 = 1+a;
int b = b1 * a * b2;

デバッグすれば b1が0になっていると分かると思います。

doubleにすれば想定された答えは求めれるのではないでしょうか。
double b1 = 1d / 2d;
double b2 = 1d + a;
double b = b1 * a * b2;

投稿2020/03/27 04:50

do31

総合スコア45

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

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

hagre

2020/03/27 11:19

do31さんご回答ありがとうございます。 doubleを習っていたのですが、思いつかなかったことが悔しいです、、 大変参考になりました、これからも頑張りたいと思います。
guest

0

ほとんど、epistemeさんの回答通りだと思いますが、
気まぐれに書いてみます。


まず、投稿するときや、編集時にある "<コード>" (または "<code>" )となっているボタンを押して、
その中に書いてください。
そうすれば、

C++

1#include<iostream> 2 3int main( void ){ 4 std::cout << "Hello" << std::endl; 5return 0; 6}

みたいにすっきりかけますよ。(サンプルはC++の場合. Java版も書けるが)

まず、epistemeさんの意見に同意見ですが、
もうちょっと踏み込んでみます。

Java

1int b; 2// ... 3// aは for文のやつ 4b=(1/2)*a*(1+a);

とありますね。

足し算引き算ならマイナスになったりとかはあっても、大体 intとかlongとかで事足りることが多いです。

もちろん、long + long とかになったら long を超えることもありますし、必ずではないですが、
ふつうはそこまでいきません。

ですが、掛け算や割り算の場合は注意が必要です。

まず普通に計算してみましょうか。

300 * 30 はなんでしょうか。

9,000‬(= 九千 )ですね。

300 と 30 をかけただけなのに こんなに行きます。
爆発的に多くなるので、int なら long, long なら long long としたほうが無難な気がします。
(私は計算苦手なのであくまで私の見解)

で、今回は、「割り算」の部分です。

20 ÷ 2 はなんでしょうか。

10ですね。割り切れるので問題はありません。

それでは 20 ÷ 7 はどうでしょうか。

Windows付属のcalc (電卓) で計算すると、

2.857142857142857 と出ました。

少数が出ていますね。これを浮動小数点数というようです。
(浮動小数点数は浮動小数点って何? - Qiita によると、

計算で誤差が発生することを前提とした数値データ

のこと

らしいです。)

で、今回の場合、格納先のb は int なので小数点以降切り捨ての可能性があります。
(環境によるのかもしれませんが)

というか、(1/2) とした瞬間に 0.5 になりますが、int型とかと解釈されることが多いようで、
小数点以下切り捨てで 0 になってしまいます。

なので、私なら一旦 double型に入れて、それから計算します。

Java

1double half = 1.0/2.0; // ここを少数で考えないけなかった…orz 2int b = half * n;

とか。

ただし、今回は私なら、別の解釈をします。

もし等差数列の和を求める公式を使うとしたら、

等差数列の和の公式の例題と証明など | 高校数学の美しい物語

を参考にして考えてみると、

  1. まず、公差は1なのでdの部分は無視。
  2. 次に n - 1 を計算する。
  3. 2a を計算する。
  4. 2 で求めたものに 1 で求めたものを足す。
  5. n を 二分の一したものを計算する。
  6. 4で求めたものに 3で求めたものをかける。

みたいに計算すると思います。

(1/2) だと、1 ÷ 2 と計算されますので、ここでは違うと思います。
よって、n ÷ 2 と 考えて計算するのです。

ただ、今回の場合は、等差数列の和の公式を使わずとも計算できますよね。

単純に

1 + 2 + 3 + 4 ... + n

としていけばいいのですから。

投稿2020/03/27 05:00

編集2020/03/31 07:25
BeatStar

総合スコア4962

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

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

momon-ga

2020/03/27 09:02 編集

> 2.857142857142857 と出ました。 > 少数が出ていますね。これを浮動小数点数というようです ん???すごい勘違いか、説明不足では?
jimbe

2020/03/27 09:37

> double half = 1/2; 無理です. int 同士の計算結果は int になりますので, double に入れても変わりません.
hagre

2020/03/27 11:15

BeatStarさん ご回答ありがとうございます。 質問の方法から問題の解決策まで、私は初学者でありますので、大変参考になりました。 とても手の込んだ解答を作って下さり、とても嬉しく、自分も理解を深めようとやる気になれます。 ありがとうございました。
hagre

2020/03/27 11:16

補足説明を加えてくれた方々、大変助かります。 まだまだ知らない単語も多くあるのがわかりましたので、それらもわかるようにこれからも学習を続けていこうと思いました。 今回はありがとうございました。
BeatStar

2020/03/31 07:18

jimbeさん あ、確かにそうですね。修正しておきます。(恥ずかしい…)
BeatStar

2020/03/31 07:19

momon-gaさん あ、確かに違いますね。修正しておきます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問