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

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

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

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

3回答

557閲覧

C言語のプログラムができないので、Cのソースコードを教えてください!!

退会済みユーザー

退会済みユーザー

総合スコア0

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2020/02/02 05:53

私は今問題を解こうとして、C言語を使ったプログラミングを作ろうとしているのですが、どのように
実際のソースコードを作ればいいのかがわかりません。なので以下の問題をとくプログラムのソースコードを教えてください!!(なるべくかんたんなソースコードがいいです。)

問題

額面がそれぞれ3,6,11、28、57、86、119の紙幣がそれぞれ1枚ずつある。これらの紙幣を使ってちょうど(過不足なく)支払うことのできない金額を次から選び、小さい順に列挙せよ。
299 111 128 71 328 255 239 260 151 163 246 184 253 97 78 114

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

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

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

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

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

y_waiwai

2020/02/02 05:55

無駄に質問を立てないように。 質問は編集できるので追記修正しましょう
meg_

2020/02/02 06:09

他の言語は出来るのですか??
guest

回答3

0

残念ながら、コード作成依頼は受けつけていません

投稿2020/02/02 06:02

y_waiwai

総合スコア88042

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

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

0

7枚のお札しかないのなら、組み合わせは2^7=128 なんで、全通り求めてしまえばいいと思いますけどね
ちょっと面白いやり方が思いついたのでソース書いてみたテスト

#define MONEY 7 int money[1 << MONEY] = {0}; int bill[MONEY] = {3,6,11,28,57,86,119}; for (int i = 0; i < MONEY; i++){ int width = (1 << i); for (int j = 0; j < width; j++){ money[width + j] = money[j] + bill[i]; } }

投稿2020/02/04 02:12

izmktr

総合スコア2856

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

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

rubato6809

2020/02/04 05:13

この回し方はあまり使わないので、確かに面白いと思いました。 ただ、できた配列 money[] は、この後、どう使う予定なんでしょうか。さほど効率の良いデータ構造とは思えない、という疑問です。
izmktr

2020/02/04 05:28

ソートしてバイナリサーチで当てればよくないです?(ついでに重複削除とか) ワークメモリを使わず、計算量をO(n^2)とするよりはこっちのほうが面白いかなぁと ワークメモリ無しでO(n)の方法があれば理想ですけどね
guest

0

この問題は少なくとも2方向のアプローチがあり、面白いと思いました。中級以上の人向けかなと。この質問者のレベルで、なぜこんな問題を解かにゃならんの?

  • 目的の金額をこれらの紙幣の組合わせで作れないか、バックトラック法で探す。

自然なアプローチに思えますが、再帰を使うので初心者向きかな?と疑問。

  • 金額(1円〜500円程度)をインデックスにして、払える・払えないの配列を作る。それには予め7枚の紙幣で払える全ての組み合わせ金額を総当りで挙げれば良い。

一旦その配列を作ってしまえば、目的の金額が払える・払えないの判定は一瞬。

forループ一個で全ての組み合わせを総当り検査するという方法は、C言語でナップザック問題 総当たりで悩んでいますで使ったものです。
この時、再帰で調べる方法を示した方がいらっしゃいました。再帰ですから、私のバックトラック法に相当するようです。

ソートの手段もいろいろ選べます。私はqsort()を使う方法と、支払えないと判定した金額を、単方向リストの適切な位置に挿入することでソートしてしまう方法を試しました。コードは書けたので、そのプログラムの動作中の様子を表示して途中のデータの様子などを見てもらってイメージだけでも掴んでもらおうと思ったのですが、気づいたら既に質問者のアカウントが凍結されていたというお粗末(苦笑)。


izmktrさん

組み合わせは2^7=128 なんで、全通り求めてしまえばいい

それが私の試した方法のひとつなので、私もその一部をアップします。

金額(1円〜500円程度)をインデックスにして、払える・払えないの配列を作る…

C

1#include <stdio.h> 2#include <stdbool.h> 3int target_prices[] = { 4 299, 111, 128, 71, 328, 255, 239, 260, 5 151, 163, 246, 184, 253, 97, 78, 114, 6}; 7int bills[] = { 3, 6, 11, 28, 57, 86, 119 }; 8bool able2pay[500]; // 最初は全て支払い不能(0〜499円に対して) 9#define N_BILLS (sizeof(bills) / sizeof(bills[0])) 10#define N_PRICES (sizeof(target_prices) / sizeof(target_prices[0])) 11int main(void) 12{ 13 // 7枚の札、全ての組合せを調べ、支払い可能な金額は true 14 printf("1. build the flag table.\n"); 15 for (int i = 1; i < (1 << N_BILLS); ++i) { 16 int mask = 1, sum = 0; 17 18 for (int j = 0; j < N_BILLS; ++j, mask += mask) { 19 if (i & mask) 20 sum += bills[j]; // この組み合わせに含まれる金額を足す 21 } 22 able2pay[sum] = true; // 合計金額sum円は支払い可能 23 } 24 25 printf("2. prices unable to pay are\n"); 26 for (int i = 0; i < N_PRICES; ++i) { 27 if (! able2pay[target_prices[i]]) 28 printf(" %d", target_prices[i]); 29 } 30 printf("\n"); 31 32 printf("TODO: sort above.\n"); 33 return 0; 34}

投稿2020/02/03 14:45

編集2020/02/05 03:30
rubato6809

総合スコア1382

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問