プロが教える店舗&オフィスのセキュリティ対策術

学校から出されたC#の問題なのですが基本仕様の中身が理解できないです。
↓基本仕様

ポケモンGoのポッポが、飴と現在のポッポの数から何体、進化できるか計算、最後に進化した数(その後、飴になっていても)、飴のあまり、ポッポのあまりを出す。
・飴の数とポッポの数を入力します
・ポッポは飴が12個で一体、進化できます
・ポッポは、博士に送ることで飴が一個、手に入ります
・ポッポから進化したピジョンも、博士に送ると飴が一個、手に入ります

何をどう組めばいいか分からないですし、どういう計算式にすればいいのかすら分からないです。
先生からヒントを訊いても教えてくれないので分かりやすいヒントを教えてください。

A 回答 (4件)

余談, あるいは「実は本質」.



「何をどう組めばいいか分からない」「どういう計算式にすればいいのかすら分からない」といってるんだけど, あなたは
具体的な数値でやってみろ
っていわれてできますか?
    • good
    • 0

ぶっちゃけこの仕様だとピジョンには


飴に変える
以外に使い道はないんだよね. でそうすると

1. 飴が 12個以上ある
→飴 (とピジョン) を使ってひたすらポッポを進化させる (そして飴に変える)
2. 飴が 1個もない
→ポッポを 1匹飴に変換する
3. 飴が 2個以上ある
→ポッポを (12-飴の数) 匹飴に変換して進化させる (そして飴に変える)
4. ポッポが 12匹以上いる
→ポッポを飴に変換しつつ進化させる (そして飴に変える)
というルーチンが組めて, これだとたぶんループが不要.

なんというか外道っぽい気もするけどルール上は OK なはず.

まあ出力の条件がさっぱりわからんけど.
    • good
    • 0

ちょっと仕様が曖昧なトコあるよね。



・飴が足りない時、ピジョンとポッポ、どっちを優先して博士に送るか。

ただ、出力見ると、結局

・飴は余って良い
・ポッポは余って良い

って条件だから、ピジョンを真っ先に博士に送るべきなんでしょうね。

考え方としては、まずは初期値設定。

1. 整数値を入力してポッポの頭数を決定する。
2. 整数値を入力して飴の個数を決定する。
3. 飴を12で割った商をピジョンの頭数とする。
4. 進化したピジョンの総数を保持するアキュムレータを作る。初期値は3.の個数
5. この時点で、ポッポの頭数から進化したピジョンの頭数を引く
6. 飴の個数は12の残余となる。

ここまでで初期状態になります。あとはループ。

以下loop。
脱出条件: 現在のポッポとピジョンと飴の総数が12以上である事(じゃないとポッポを進化させられない)、かつポッポは1頭以上いるのが条件(※1)

条件1: ピジョンが0の時、ポッポを博士に送る => ポッポが一匹消費で飴が1個増える
条件2: 条件1じゃない時、ピジョンを博士に送り飴を1個得る

別の条件: 飴が12個でポッポが1匹以上いるのならポッポが一匹ピジョンに変わる(※2)

多分これでO.K.かしらん?
例によってJavaで書くと次のようなコードになります。
参考までに。

import java.util.Scanner;

public class Main {
 public static void main(String[] args) {
  Scanner scanner = new Scanner(System.in);
  int pidgeys = scanner.nextInt(); // ポッポの数
  int candies = scanner.nextInt(); // 飴の数
  int pidgeotto = candies / 12; // 飴によって進化したピジョンの数
  int evolved = pidgeotto; // アキュムレータ
  pidgeys -= pidgeotto; // ポッポの余り
  candies %= 12; // 飴の余り
  while ((pidgeys + pidgeotto + candies > 11) && (pidgeys > 1)) {
   if (pidgeotto == 0) {
    pidgeys -= 1;
    candies += 1;
   } else {
    pidgeotto -= 1;
    candies += 1;
   }
   if ((candies == 12) && (pidgeys > 0)) {
    pidgeotto += 1;
    evolved += 1;
    pidgeys -= 1;
    candies = 0;
   }
  }
  System.out.println("進化した数: " + evolved + "\n飴のあまり: " + candies + "\nポッポの余り: " + pidgeys);
 }
}

※1: この辺仕様がちょっとハッキリしない。
例えば初期条件でポッポが12匹、飴が12個あるとする。
この時点でポッポは一匹ピジョンになり、ピジョン1匹、ポッポが11匹になり、飴の個数は0だ。
さてこの後どうするか?博士にピジョンもポッポも全部送れば飴12個がゲット出来る。ただし、この時点でて手持ちのポッポは1匹もないので手元に残るのは飴12個のみ、である。果たしてこれは最適解なのか否か?
当然、手持ちでピジョン1匹、ポッポ11匹で飴が0個、と言うのも「最適解の可能性アリ」なんだけど、いずれにせよ、仕様がハッキリしないので何とも言えないのである。
この「ポッポを取るか飴を取るか」はこの脱出条件のポッポの頭数をどうするか、によって調整可能である。

※2: 当然飴があってもポッポがいなければ、ピジョンに進化は不可能である。
    • good
    • 0

進化した数の最大を求めるならば、進化後に


* 進化したピジョンは全て飴に変える
* ピジョンがいないなら、ポッポ1匹を飴に変える
と処理して、手持ちのポッポがいなくなるまで
進化を繰り返せばよいと思います。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!