• ベストアンサー

c言語のプログラム

「1」が3枚、「3」が3枚、「5」が3枚、「7」が4枚、「9」が5枚で合計18枚のカードがある。このカードを並べて6桁の数を3個作り、その3個の数の総和が「1234567」となるカードの組み合わせをすべて求めたいのですがどうすればよいか全然分かりません。 6桁の数を配列で表現し、和を求めるときに1の位から上位の桁へ順番に和が一致しているかチェックするのを、再帰呼び出しででしたいです。

質問者が選んだベストアンサー

  • ベストアンサー
  • nag0720
  • ベストアンサー率58% (1093/1860)
回答No.1

考え方だけ。 (1) 18枚のカードの中から一の位のカード3枚の組み合わせをすべて調べ、3枚の合計の末尾が7なら(2)の処理を実行する。 (2) 残り15枚のカードの中から十の位のカード3枚の組み合わせをすべて調べ、3枚の合計と一の位の繰り上がりとの計の末尾が6なら(3)の処理を実行する。 (3) 残り12枚のカードの中から百の位のカード3枚の組み合わせをすべて調べ、3枚の合計と十の位の繰り上がりとの計の末尾が5なら(4)の処理を実行する。 (4) 残り9枚の・・・・・・・・・・・・・・・・・ (5) 残り6枚の・・・・・・・・・・・・・・・・・ (6) 残り3枚のカードの組み合わせをすべて調べ、3枚の合計と万の位の繰り上がりとの計が12なら結果を出力する。 (1)~(6)は同じような処理なので、これを1つの関数にまとめて自分自身を呼び出すようにします。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • c言語の問題

    c言語のプログラム 「1」が3枚、「3」が3枚、「5」が3枚、「7」が4枚、「9」が5枚で合計18枚のカードがある。このカードを並べて6桁の数を3個作り、その3個の数の総和が「1234567」となるカードの組み合わせをすべて求めたいのですがどうすればよいか全然分かりません。 6桁の数を配列で表現し、和を求めるときに1の位から上位の桁へ順番に和が一致しているかチェックするのを、再帰呼び出しででしたいです。

  • C言語での並び替えのプログラム

    A[6][5]={{"abei"}, {"aceh"}, {"adeg"}, {"aef"}, {"bcfi"}, {"bdfh"}}; と配列があるとします。 (a).A[1][5]の文字列とA[2][5]の文字列を比較して、"abceih"という組み合わせた文字列を作り、その文字列の数を出します(この場合6個)。次に、A[3][5]のA[4][5]を比較して組み合わせて文字列を作り、その文字列の数を出します。A[5][5]とA[6][5]も同じように比較して組み合わせて文字列を作り、その文字列の数を出し、最後にそのすべての数の和を出します。 (b).この配列を並べ変えて(a)をします。 並び替え方は配列6個のとき 1.(1)(2)(3)(4)(5)(6) 2.(1)(2)(3)(5)(4)(6) 3.(1)(2)(3)(6)(4)(5) 4.(1)(3)(2)(4)(5)(6) 5.(1)(3)(2)(5)(4)(6) 6.(1)(3)(2)(6)(4)(5) 7.(1)(4)(2)(3)(5)(6) 8.(1)(4)(2)(5)(3)(6) 9.(1)(4)(2)(6)(3)(5) 10.(1)(5)(2)(3)(4)(6) 11.(1)(5)(2)(4)(3)(6) 12.(1)(5)(2)(6)(3)(4) 13.(1)(6)(2)(3)(4)(5) 14.(1)(6)(2)(4)(3)(5) 15.(1)(6)(2)(5)(3)(4) の15通りになります。 この配列の並びを前から配列を2つずつ取り出して比較すれば全組み合わせが完了したことになります。 この15通りの組み合わせの中で総和が一番少なくなる組み合わせ方を探すプログラムを作りたいのです。 そしてこのとき、配列が最大で40個までとなることがあるとするとその並べ替えのプログラムはどうなるでしょうか? 比較するプログラムは作ることに成功しましたが並べ替えのプログラムがうまく作れません誰か教えていただけないでしょうか?

  • C言語のプログラムについて

    C言語のプログラムについて 3桁の自然数の中で、自分自身を含めた約数が奇数になるものがいくつあるかを求めるプログラムを作りたいのですが、swich文を使って、6通りの方法で出そうとしていまして、 while 文、 for文、 do while文に加え、 for文のを、1つの関数として独立させたもの、 さらに、for文のを重ループ部分のそれぞれのループに対応して、2つの関数として独立させたもの、 そして、この2つの関数のどちらともをループを用いずに再帰呼び出しを用いたもの の6通りで出したいのですが、swich文を使うところは自力でできたのですが、あとの6つそれぞれのプログラムの組み方がわかりません。 教えていただけないでしょうか?ややこしい書き方をしてすいません・・・。

  • C言語の質問。

    課題が出たのですがよくわからないので回答していただける方お願いします。 # 次のようにキーボードから4桁の10進数の入力を2回受付ける. Input the 1st value > 6479 Input the 2nd value > 1497 但し,4桁の各位の数は必ず互いに異なるものが入力されるとする. # 入力された数値に対して,以下に定義する「ヒット数」と「ホームラン数」を求める. * ホームラン数: 二つの数字を同じ位ごとに比較した時,何ヶ所の位について一致しているかを表す. * ヒット数: 二つの数字を異なる位同士で比較した時,一致している組み合わせの数を表す. 例 1234と1234の場合,0ヒット4ホームラン 1234と4321の場合,4ヒット0ホームラン 6479と1497の場合,2ヒット1ホームラン # ヒット数とホームラン数を次のように表示する. 2 hit(s) 1 home run(s)

  • 整数問題/2ケタの整数を2個ずつ作る

    以下の問題です。 -------------------------------------- 1~9の数字が書かれた9枚のカードがあります。 今,A君がまず2枚のカードを取り,十の位の数が一の位の数より大きくなるように並べて2ケタの数を作り,さらに2枚のカードを取り,十の位の数が一の位の数より大きくなるように並べて2ケタの数を作ります。こうして,A君は2ケタの数を2つ作ります。 次に,B君が残りの5枚のカードからA君と同様に2ケタの数を2つ作ります。 A君が作った2つの2ケタの数の和とB君が作った2つの2ケタの数の和が同じになったとき,和は全部で何通り考えられますか。 --------------------------------------------- [1]のカードを使わない場合は,繰り上がりがないので数えやすいのですが(6通り), その他の場合は,繰り上がりがないことの証明はどうしたらいいのでしょうか。 お力をお貸しください。

  • 再帰呼びだし

    再帰呼びだし 問題1 再帰呼び出しを用いてint型の配列({-9、8、-7、6、5、4、1、3、6、9、2、-14})の最小値を求めて出力するプログラムを作成せよ。関数名はmin_of_arrayとする。 問題2 同じく再帰呼び出しを用いてint型の配列({3、4、1、5、2})を小さい方から順番に求めて出力するプログラムを作成せよ。 再帰呼び出しが苦手で、じっくり解いていこうと思ったのですが、他の課題もあって、もう提出期限いっぱいいっぱいなので載せました。 どうかよろしくお願いします。

  • 合計が決まった数で、数の組み合わせを求めるには

     ちょっと数学的な問題を、パソコンで解きたいと思います。  合計が決まった数で、ある数の集まりの中からその和の組み合わせを求めたいのですが、何を使ってどのようにすればよいでしょうか。  ソフトは、Excel/Access/FileMakerがあります。  回答でなくても、自分ならこうやるよ、という意見も大歓迎です。  よろしくお願いします。 (例題) {2550,1210,90150,110223,17112,142816,87442,14650,1701413,11788,4460,24180}の中で総和が1949096になる数の組み合わせは?

  • *皆さん、この数字パズルの効率のいい解き方を教えてください*

    すみません、さっきの質問で回答者様からご指摘をいただいたので修正しました。 問題)1、2、3、4、5、6、7、8、9のカードを使って3桁+3桁+3桁=3桁の足し算で答えの数字が最大になる式を答えてください。※答えはカードを使わなくてOKです。 この問題、答えはいくつかあると思います。 数学が全くダメな自分なりに考えて解き方を見つけてはみたのですが、どうももっと効率のいい解き方があるような気がして仕方ありません。 どうかみなさんの力を貸してください。 答えの例をひとつとあなたの解いた解きかたを書いてほしいです。 特に解き方を詳しくお願いします。 回答していただいた方には気づき次第全員にお返事します。 自己流で出した一例)152+368+479=999 解き方)答えが三桁より1000を超えてはいけないので左辺の式の百の位の合計が10を超えないようにする。また、合計が9になると十の位以下を考えるとき続かなくなるので9もダメ。 よって百の位の合計が8以下になるようにする。 合計が8以下になるのは1、2、3、4、5の中から3つ選び出して組み合わせたときのみ。ここでは小さいほうから使って1、3、4を百の位に使う。 ここで1000を超えない最大の整数は999です。 次に百の位をいったん置いといて考えます。十の位、一の位の2桁+2桁+2桁の足し算は999-800=199で、2桁+2桁+2桁=199に一番近づくようにすればいいので、百の位で使った以外のカードを組み合わせて52+68+79=199という組み合わせを作ります。 最初の百の位で使ったカードとこれをくっつっけて 152+368+479=999を出す。

  • 数の和について

    2から5までの数を1回ずつ使って異なる4桁の数をつくる方法は24通りある。これらすべての数の和は 千くらいの数の和、百の位の数の和、十の位の数の和、一の位の数の和についてそれぞれ計算して。 まず、最初に、千の位数の和について 千の位が2のもの、千の位が3のもの、千の位が4のもの、千の位が5のもので 6個あるのことがわかりません。 どうして6個あるのですか?

  • 三元一次方程式です

    3けたの自然数があり、各位の数の和は15である。 百の位の数と十の位の数の和は一の位の数より1小さく、 もとの数の百の位の数と一の位の数を入れ替えた数との和は1191である。 このとき、もとの自然数を求めなさい。 教えてください!