- ベストアンサー
c言語の問題
c言語のプログラム 「1」が3枚、「3」が3枚、「5」が3枚、「7」が4枚、「9」が5枚で合計18枚のカードがある。このカードを並べて6桁の数を3個作り、その3個の数の総和が「1234567」となるカードの組み合わせをすべて求めたいのですがどうすればよいか全然分かりません。 6桁の数を配列で表現し、和を求めるときに1の位から上位の桁へ順番に和が一致しているかチェックするのを、再帰呼び出しででしたいです。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
こんな感じかな。 void check(int p, int numcnt[], int num[], int *pcnt) { static const int number[] = {1, 3, 5, 7, 9}; for (int i = 0; i < 5; i++) { if (numcnt[i] > 0) { num[0] += number[i] * p; numcnt[i]--; for (int j = 0; j < 5; j++) { if (numcnt[j] > 0) { num[1] += number[j] * p; numcnt[j]--; for (int k = 0; k < 5; k++) { if (numcnt[k] > 0) { num[2] += number[k] * p; numcnt[k]--; if (p < 100000) { if ((num[0] + num[1] + num[2]) % (p * 10) == 1234567 % (p * 10)) check(p * 10, numcnt, num, pcnt); } else { if (num[0] + num[1] + num[2] == 1234567) { (*pcnt)++; printf"%d : %d + %d + %d = %d\n", *pcnt, num[0], num[1], num[2], num[0] + num[1] + num[2]); } } num[2] -= number[k] * p; numcnt[k]++; } } num[1] -= number[j] * p; numcnt[j]++; } } num[0] -= number[i] * p; numcnt[i]++; } } } void main() { int numcnt[] = {3, 3, 3, 4, 5}; int num[] = {0, 0, 0}; int cnt = 0; check(1, numcnt, num, &cnt); } ただし、このプログラムは3つの数の順番が違う場合を別の組み合わせとして数えています。 3つの数の順番が違っても同じ組み合わせとするなら、 if (num[0] + num[1] + num[2] == 1234567) { の箇所を、 if (num[0] + num[1] + num[2] == 1234567 && num[0] <= num[1] && num[1] <= num[2]) { とすればいいです。
その他の回答 (2)
- asuncion
- ベストアンサー率33% (2127/6289)
再帰呼び出しの話の前に、 >このカードを並べて6桁の数を3個作り、 この部分はできているんですか?
補足
すいませんがいまいちわかりません。
- Wr5
- ベストアンサー率53% (2173/4061)
http://okwave.jp/qa/q7594647.html こちらの回答(というかヒント)では不満ですか?
補足
ヒントはありがたいですが、ヒントをどう再現したらよいかわかりません。
お礼
ありがとうございます。
補足
これのあとに再帰呼び出しすることでプログラムはできますか??