単二電池

「1~499円までの金額を入力し、必要な貨幣の枚数を求める」
というプログラムはどういう風にすればいいでしょうか?

できるだけむずかしくないやり方で教えていただけると
嬉しいです。

A 回答 (9件)

#include <stdio.h>


main()
{
int a,b;
printf("0で終了\n");
for (;;) {
for (;;) {
printf("金額?");
a = 0;
if (scanf("%d",&a) != 1) break;
if ((a < 0) || (a > 499)) printf("1~499の");
else break;
}
if (a == 0) break;
b = a/100;
b += (a % 100) / 50;
b += (a % 50) / 10;
b += (a % 10) / 5;
b += a % 5;
printf("%d円は硬貨%d枚\n",a,b);
}
}

ANo.1は題意に従ってないので不正解。5円を忘れてるし。

この回答への補足

お答えありがとうございます。
今回質問させていただいた問題は
if文は使わずにできるようです。
やはり「1~499円までの金額を入力する」という事は無視できませんよね。

補足日時:2009/01/25 16:10
    • good
    • 0

>今回質問させていただいた問題は


>if文は使わずにできるようです。
>やはり「1~499円までの金額を入力する」という事は無視できませんよね。

do~whileループの終了条件に金額の判定式を書けば、変な金額を入力された時はループを抜けないで入力を繰り返す、と言う書き方に変えれば、いくらでもif文を使わずに書けます。

しかし、どっかの誰かが「if文は使わずにできる」と発言したのは「硬貨の枚数を求める計算部分」だと思われます。

もし、出題者が「if文使わないで書いて」とかふざけた事を抜かすなら

#include <stdio.h>
main()
{
int a,b;
printf("金額?");
scanf("%d",&a);
b = a/100;
b += (a % 100) / 50;
b += (a % 50) / 10;
b += (a % 10) / 5;
b += a % 5;
printf("%d円は硬貨%d枚\n",a,b);
}

とかってプログラムでも提出して「変な金額を入力した時?そんなの知らない」とでも言い返してやりましょう。

この回答への補足

まとめて補足いたします。不明瞭な点が数々あった事をお詫びします。

問題には、「1~499円までの金額を入力し、必要な貨幣の枚数を求めるプログラム」としか書かれていないので、
さらに詳しい事は正直分かりません。

「if文を使わず…」と言ったのはその問題が、if文について説明される前(のページ)に書いてあるからです。

詳しい方のおかげで理解ができました。ありがとうございます。

補足日時:2009/01/26 19:34
    • good
    • 0

うん。

僕も#7さんの意見に賛成で、「だと思う」と「です」だと全く方針が変わりますね。そこはハッキリすべき、だと思います。
単に、最小限の貨幣の枚数求めるだけ、だったら実は至極簡単だ、と思いますが、「組み合わせ数」求めるとしたらかなりやっかいです。
ただし、「組み合わせ数求めよ」だったら、パズルっぽい問題として、割に「良く見かける」んですよ。ある意味有名な問題ですしね(だから、#4でその問題じゃないか、と書いたのです)。
どの道、「憶測で」プログラム書くのもアレですんで、もうちょっと問題調べて正確なトコロを投稿すべき、だと思います。
    • good
    • 0

 こんにちは。



 “だと思う”ではなく“です”になるよう事前に確認してください。
違うとプログラム設計の根本が崩れますので。

 まず、どのように処理すれば実現できるかについてご自身の考え
を聞かせてください。
そして、各処理を実現する為にどのような処理の流れをしていくかを
説明してください。
 できれば作成したソースを載せていただけるとありがたいです。

 また以下の用途にも対応できるのが理想です。
 ・紙幣に対応(一万円等)
 ・50円は使わない等の選択
 ・164円等の変則的な貨幣への対応
 私の場合、以上の要望を含めた処理部分が20行程で作成できました。
努力されて作成されたコードを提示して頂ければ。あくまでサンプルとして
載せても構いませんが...

 ご参考までに。
    • good
    • 0

#5 に加えて


・使える金種の指定と
・「ちょうどその金額を作るのに必要」という条件
が必要です. じゃないと「500円玉 1枚」が常に最適になる.

この回答への補足

#5の方も含め、補足いたします。
たぶん、値の大きい貨幣から考えて、できるだけ貨幣の枚数を最小に。という事だと思います。
100円玉が何枚必要で、50円玉が何枚必要…という具合に、
値の小さい貨幣(1円,5円など)が少なく済むように。
という事だと思います。

補足日時:2009/01/25 15:49
    • good
    • 0

いちばん少ない枚数で、というような付帯条件はありませんか?

    • good
    • 0

>「1~499円までの金額を入力し、必要な貨幣の枚数を求める」


というプログラムはどういう風にすればいいでしょうか?

これ、直感的に言うと、おかしな問題なんですよね。
例えば。
499円だったら1円玉だったら499枚ですよね?当たり前、です。と言う事は「必要な貨幣の枚数を求める」のなら499枚。入力された数をそのまま返せば良い、って事になる。これっておかしくないですか?
つまり、任意の組み合わせで良ければ「どーにでもなる」んですよ。1円玉使えば全て解決です(笑)。
そうじゃなくって「組み合わせ数」求める問題なんじゃないか、と。じゃないと問題として成り立たないのでは、と思います。
    • good
    • 0

そのものズバリを書いたらプログラムの学習にならないので、


・100で何回引けるか数えて余りを残す。引けた回数が100円玉の数。
・次に50,10,5と数値を変えて引ける回数を調べる(当然余りから)。
・余りが5未満になったら、それが1円玉の数。
自分の出来る範囲で、これをプログラム化してみましょう。
ifやwhileで条件式が書けて表示にprintfが分れば作れます。
    • good
    • 0

100円、50円、10円、1円がそれぞれ何枚必要なのか


割り算の商をintの変数に代入する方法だと簡単かもしれません。

#include <stdio.h>

main()
{
int a = 499;
int b = a/100;
int c = (a-b*100)/50;
int d = (a-b*100-c*50)/10;
int e = (a-b*100-c*50-d*10)/1;

printf("%d %d %d %d %d\n",a,b,c,d,e);
}

この回答への補足

お答えありがとうございます。
このプログラムに「1~499円までの金額を入力する」という
部分を入れる事できますか?
たぶん入力する事は省略しても良いと思うのですが。

補足日時:2009/01/25 16:18
    • good
    • 0

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