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

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

ただいまの
回答率

90.34%

Javaで四則演算 応用

解決済

回答 5

投稿

  • 評価
  • クリップ 0
  • VIEW 1,478

yk-211

score 37

0から100までの数字を利用し、
0から40までは掛け算
40から50までは引き算
50から100までは足し算とし合計を求めよ という問題です。

---------------------------------------------------------------------
途中まで書いてみましたが、よく分からず3時間詰まっています。
どのように整理していけばよいか教えてくださいませ。

public static void main(String args[]){
           int sum = 0;
           int dec = 0;
        for(int i = 1; i <= 40; i ++) {
        sum += i;
            
            System.out.println(sum);
        }
        for(int j = 41;j<=50; j ++){
        dec -= j;
        
            System.out.println(dec);
        }
    }
}
  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

質問への追記・修正、ベストアンサー選択の依頼

  • haru666

    2015/05/20 10:19

    問題文の意図しているところが正確にわかりませんでした。
    0から40までは掛け算、というのは40の階乗を求めろということでしょうか?
    (すると0は含まない気がします、0から始めるとその答えは0ですよね…?)

    キャンセル

  • yk-211

    2015/05/20 10:27

    申し訳ありません。
    正確には1から40までは掛け算
    40から50までは引き算
    51から100までは足し算です。

    はいそうでございます。
    1からの階乗で打と思います。

    キャンセル

回答 5

checkベストアンサー

0

まず、問題文から今回どのような結果を画面に表示するか考えてみましょう。
「合計を求めよ」 となっているので、今回は合計を1つ求めればいいでしょう。

int total = 1; // 掛け算から始まるため、0ではなく1を使います。

この合計を求める変数totalに、全ての計算を行います。
結果表示は1度だけなので、次にそれを書きましょう。

int total = 1;

// ここで 1...100 の数値を計算させる

System.out.println(total); // 求めた合計を画面に表示させる部分を書きましょう

今回問題で指示されていることは以下の3つです。
3つまとめて考えるのではなく、一つずつ解いていくことにしましょう。
  • 1から40までは掛け算 
  • 40から50までは引き算 
  • 50から100までは足し算

int total = 1;

// 1から40まで合計に掛け算する
for (int number=1; number <=40; number++) {
    // totalに対してnumberを掛け算
    total *= number;
}
// 41から50まで合計に引き算する
for (int number=41; number <=50; number++) {
    // 同じようにtotalに対してnumberを引き算
}
// 51から100まで合計に足し算する
for (int number=51; number <=100; number++) {
    // 同じようにtotalに対してnumberを足し算
}

System.out.println(total);


おまけ
一つ問題があります。
total に 40の階乗がこのままだと入りません。
40の階乗という数値はとても大きいのです。
long や int ではオーバーフローを起こしてしまい正しく計算できません。
この点については、学校の先生に問題の解釈があっているか聞いて下さい。

ただ、それだとあまりにもあれなので…
この計算ができるクラスjava.math.BigIntegerを使った場合の答えを書いておきますね。

import java.math.*;

BigInteger total = BigInteger.valueOf(1);

// ループは一つにすることもできます。
for (int number=1; number <=100; number++) {
    if (number <= 40) {
        // 40まではtotalに対してnumberを掛け算
        total = total.multiply(BigInteger.valueOf(number));
    }
    else if (number <= 50 {
        // 次の50までは(=41から50までは)totalに対してnumberを掛け算
        total = total.subtract(BigInteger.valueOf(number));
    }
    else {
        // その他(=51以上)から最後まではtotalに対してnumberを足し算
        total = total.add(BigInteger.valueOf(number));
    }
}

System.out.println(total);

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2015/05/20 11:28

    大変分かりやすく説明してくださり、ありがとうございました!
    途中からlongを使ってやってみたりしましたが、出来なかったので・・・

    こういったやり方があるとは考えてもみませんでした。
    本当にありがとうございます。

    キャンセル

0

上記の問題ですが、こちらになると思います。
考え方は質問者様と同じで、上から順に指定された値に対してそれぞれ演算をさせています。
public static void main(String[] args) {

    int ans = 1;
    for (int i = 0; i <= 40; i++) ans *= i;
    System.out.println(ans);

    ans = 0;
    for (int i = 40; i <= 50; i++) ans -= i;
    System.out.println(ans);

    ans = 0;
    for (int i = 50; i <= 100; i++) ans += i;
    System.out.println(ans);
}

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2015/05/20 10:40

    お答えいただきありがとうございます。
    1番上の積の部分が0となりますが、
    どうすれば答えが出ますでしょうか。

    キャンセル

  • 2015/05/20 10:45

    0が答えです。初期値に0が代入されているためなにをかけても0になります。
    iの初期値を0ではなく1にしてあげると1から40までの掛け算された数値が出てきますので正しく計算されているのがお分かりいただけるかと思います。

    キャンセル

0

for文をいくつも書くよりも、1つにまとめた方がスッキリすると思います。
いくつかのロジックが考えられるので、いろいろ試してみてください。
自分は以下のようにしてみました。
public static void main(String args[]){ 
        int ans = 1;
        for(int i = 1; i <= 100; i ++) {
            if(i <= 40){
                ans *= i;
            }else if(i > 40 && i <= 50){
                if(i == 41){
                    System.out.println(ans); 
                    ans = 0;
                }
                ans -= i;
            }else{
                if(i == 51){
                    System.out.println(ans); 
                    ans = 0;
                }
                ans += i;
            }
            if(i == 100){
                System.out.println(ans); 
            }
            
        } 
    } 
}

※追記
合計だけ出力すればよさそうだったので修正しました。

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2015/05/20 10:52

    このコードはまずいです.
    最初に1から40まで掛けると確実に30桁以上の数になるので,
    ansがint型やlong型ではオーバーフローしてしまいます.
    double型にするしかないように思います.
    それからelse ifのi>40は不要だと思います.

    キャンセル

  • 2015/05/20 10:58

    考えてみるとこの問題はオーバーフローしてしまいますね

    キャンセル

  • 2015/05/20 11:31

    回答ありがとうございます!
    とても参考になりました。
    今後ともよろしくお願いいたします。

    キャンセル

  • 2015/05/20 11:39

    swordoneさん
    おっしゃる通りです。
    実際に動かしてみたわけではなかったのですが、気が付きませんでした。。。
    ご指摘ありがとうございます!

    キャンセル

0

int number = 1;
double ans = 1;
for( ; number <= 40; number++)
    ans *= number;
for( ; number <= 50; number++)
    ans -= number;
for( ; number < 100; number++)
    ans += number;
System.out.println(ans);
ただなんとなく,下の意図のような感じがわずかにします.
public static void main(String args[]){
    int ans = 0;
    for(int i = 0; i < args.length; i++){
        int num = Integer.parseInt(args[i]);
        if(num < 1 || num > 100) continue; //扱いがわからないので無視
        if(num <= 40) ans *= num;
        else if(num <= 50) ans -= num;
        else ans += num;
    }
    System.out.println(ans);
}

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2015/05/20 11:30

    回答ありがとうございます!
    かなりすっきりとまとまっており、分かりやすいです。
    今後ともよろしくお願いいたします。

    キャンセル

-1

解決後に失礼します。

「0から100までの数字を利用し」という条件を
みなさん外してしまっているので、
0の扱いを、今一度確認したほうが良いかもしれませんね。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2015/05/20 11:44

    修正依頼のコメントで0は除外されていることを確認済みです.
    質問者が質問を編集していないだけです.

    キャンセル

  • 2015/05/20 11:52

    あ、ホントだ。
    修正依頼の部分、閉じられて画面が表示されていたので、見落としていました。

    キャンセル

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

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

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