🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

6回答

871閲覧

4^4=256通りの組み合わせをすべて2次元配列[256][4]に入れる

hromj

総合スコア9

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2019/10/10 07:10

c++で、4通りの数値を配列に重複なく入れたいです。

例として、数値A,B,C,Dがあり
[0][0]=A;
[0][1]=A;
[0][2]=A;
[0][3]=A;

のように、[0][]=AAAA
から、[256][]=DDDD
まですべて入れたいです。
[0][]=AAAA に対し、[63][]=AAAAのように完全な重複はないものとします。
ご教授願ます。

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

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

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

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

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

Zuishin

2019/10/10 07:16

どこの国の人ですか?
cateye

2019/10/10 07:55

(^_^;)・・・・・・・
guest

回答6

0

ベストアンサー

そのインデックスの数字のビット0からビット7までの2ビットづつ0~3をA~Dに変えればよろしい

#256通りなのね

投稿2019/10/10 07:17

編集2019/10/10 07:20
y_waiwai

総合スコア88038

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

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

hromj

2019/10/10 08:01

解答ありがとうございます。おかげさまで完成しました。
episteme

2019/10/10 08:09

5通りとなった途端にアウトなんよなーコレ
thkana

2019/10/10 23:07

今回は4進数だからビット割当すると綺麗だけど、一般論としては0 ~ pow(N,M)-1の数を生成してN進数M桁で表現するっていう話よね。
guest

0

文字列の扱い、配列の扱いは、もっと工夫の余地がありますが、ともかく動作するものを示しましす。
p.cpp

c++

1#include <iostream> 2#include <string> 3 4const int LEN = 4; 5const char CHARS[] = "ABCD"; 6std::string data[4 * 4 * 4 * 4]; 7 8int main(void) { 9 10 int p = 0; 11 for(int a = 0; a < LEN; a++) { 12 std::string c0(CHARS, a, 1); 13 for(int b = 0; b < LEN; b++) { 14 std::string c1(CHARS, b, 1); 15 for(int c = 0; c < LEN; c++) { 16 std::string c2(CHARS, c, 1); 17 for(int d = 0; d < LEN; d++) { 18 std::string c3(CHARS, d, 1); 19 20 data[p++] = c0 + c1 + c2 + c3; 21 } 22 } 23 } 24 } 25 26 for(int i = 0; i < p; i++) { 27 std::cout << (i + 1) << ":\t" << data[i] << std::endl; 28 } 29}

実行例:
イメージ説明
イメージ説明

再帰を使ったり、malloc を使えば、、for ループのネスト削除していろいろな個数の組み合わせに対応できるようにできるはずです。

投稿2019/10/10 22:00

katoy

総合スコア22324

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

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

0

y_waiwaiさんの回答をそのままコードにしました・・・たぶん^^;

c

1#include <iostream> 2#include <iomanip> 3 4int main(void) 5{ 6 static const char abcd[]= "ABCD"; 7 for( int i= 0; i < 256; i++ ){ 8 std::cout << std::setw(4) << i << "番目:"; 9 std::cout << abcd[i&03] << ',' << abcd[(i>>2)&03] << ',' << abcd[(i>>4)&03]; 10 std::cout << ','<< abcd[(i>>6)&03] << ','<< abcd[(i>>8)&03] << std::endl; 11 } 12 return 0; 13}

検証は自分で・・・以下結果(途中省略)・・・

text

1usr ~/Project/test % ./a.out 2 0番目:A,A,A,A,A 3 1番目:B,A,A,A,A 4 2番目:C,A,A,A,A 5 3番目:D,A,A,A,A 6 4番目:A,B,A,A,A 7 5番目:B,B,A,A,A 8 6番目:C,B,A,A,A 9 7番目:D,B,A,A,A 10 8番目:A,C,A,A,A 11 9番目:B,C,A,A,A 12 10番目:C,C,A,A,A 13 11番目:D,C,A,A,A 14 12番目:A,D,A,A,A 15 13番目:B,D,A,A,A 16 14番目:C,D,A,A,A 17 15番目:D,D,A,A,A 18 16番目:A,A,B,A,A 19 17番目:B,A,B,A,A 20 18番目:C,A,B,A,A 21 19番目:D,A,B,A,A 22 20番目:A,B,B,A,A 23 21番目:B,B,B,A,A 24 22番目:C,B,B,A,A 25 23番目:D,B,B,A,A 26 24番目:A,C,B,A,A 27 25番目:B,C,B,A,A 28 26番目:C,C,B,A,A 29 27番目:D,C,B,A,A 30 28番目:A,D,B,A,A 31----->8----->8----->8----->8----->8----- 32 220番目:A,D,B,D,A 33 221番目:B,D,B,D,A 34 222番目:C,D,B,D,A 35 223番目:D,D,B,D,A 36 224番目:A,A,C,D,A 37 225番目:B,A,C,D,A 38 226番目:C,A,C,D,A 39 227番目:D,A,C,D,A 40 228番目:A,B,C,D,A 41 229番目:B,B,C,D,A 42 230番目:C,B,C,D,A 43 231番目:D,B,C,D,A 44 232番目:A,C,C,D,A 45 233番目:B,C,C,D,A 46 234番目:C,C,C,D,A 47 235番目:D,C,C,D,A 48 236番目:A,D,C,D,A 49 237番目:B,D,C,D,A 50 238番目:C,D,C,D,A 51 239番目:D,D,C,D,A 52 240番目:A,A,D,D,A 53 241番目:B,A,D,D,A 54 242番目:C,A,D,D,A 55 243番目:D,A,D,D,A 56 244番目:A,B,D,D,A 57 245番目:B,B,D,D,A 58 246番目:C,B,D,D,A 59 247番目:D,B,D,D,A 60 248番目:A,C,D,D,A 61 249番目:B,C,D,D,A 62 250番目:C,C,D,D,A 63 251番目:D,C,D,D,A 64 252番目:A,D,D,D,A 65 253番目:B,D,D,D,A 66 254番目:C,D,D,D,A 67 255番目:D,D,D,D,A 68usr ~/Project/test %

投稿2019/10/10 08:37

cateye

総合スコア6851

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

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

cateye

2019/10/10 08:42

文字じゃなかった(;;)
guest

0

C++

1#include <iostream> 2 3#define T3(x,y,z) {x,y,z,A},{x,y,z,B},{x,y,z,C},{x,y,z,D} 4#define T2(x,y) T3(x,y,A),T3(x,y,B),T3(x,y,C),T3(x,y,D) 5#define T(x) T2(x,A), T2(x,B), T2(x,C), T2(x,D) 6 7int main(void) 8{ 9 int A = 1, B = 3, C = 5, D = 9; 10 int a[256][4] = { T(A), T(B), T(C), T(D) }; // 入れました。 11 12 // 以下、確認 13 for (int i = 0; i < 256; i++) 14 std::cout << "a[" << i << "] = { " << a[i][0] << ", " 15 << a[i][1] << ", " << a[i][2] << ", " << a[i][3] << " }\n"; 16}

追記
6通りの数値まで扱えるようにしてみました。

C++

1#include <iostream> 2 3const int N = 3; // N: 1, 2, 3, 4, 5, 6 4const int M = 27; // NのN乗: 1, 4, 27, 256, 3125, 46656 5int a[M][N]; 6 7int main() 8{ 9 int A = 1, B = 3, C = 4, D = 6, E = 7, F = 9; 10 int n[] = { A, B, C, D, E, F }; 11 12 for (int i = 0; i < M; i++) 13 for (int v = i, j = N; --j >= 0; v /= N) a[i][j] = n[v % N]; 14 15 // 以下、確認 16 for (int i = 0; i < M; i++) { 17 std::cout << "a[" << i << "] = { " << a[i][0]; 18 for (int j = 1; j < N; j++) std::cout << ", " << a[i][j]; 19 std::cout << " }\n"; 20 } 21}

追記2
再帰呼出しを使うと、

C++

1#include <iostream> 2#include <algorithm> // copy 3 4const int N = 4; // N: 1, 2, 3, 4, 5, 6 5const int M = 256; // NのN乗: 1, 4, 27, 256, 3125, 46656 6int a[M][N], b[N], k = 0; 7 8const int A = 1, B = 3, C = 4, D = 6, E = 7, F = 9; 9const int n[] = { A, B, C, D, E, F }; 10 11void gen(int i) 12{ 13 if (i < N) 14 for (int j = 0; j < N; j++) 15 b[i] = n[j], gen(i + 1); 16 else 17 std::copy(b, b + N, a[k++]); 18} 19 20int main(void) 21{ 22 gen(0); 23 24 // 以下、確認 25 for (int i = 0; i < M; i++) { 26 std::cout << "a[" << i << "] = { " << a[i][0]; 27 for (int j = 1; j < N; j++) std::cout << ", " << a[i][j]; 28 std::cout << " }\n"; 29 } 30}

投稿2019/10/10 08:19

編集2019/10/11 21:30
kazuma-s

総合スコア8224

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

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

0

C ですが、 malloc をつかって 256 という数字をつかうことなく結果を保持するようにしてみました。

c

1#include <stdio.h> 2#include <stdlib.h> 3#include <string.h> 4 5const char * CHARS = "ABCD"; 6const int LEN = 4; 7 8void show_result(char * result[], int num) { 9 for (int i = 0; i < num; i++) { 10 printf("%d:\t%s\n", i, result[i]); 11 } 12} 13 14int main() { 15 int result_size = 16; 16 char ** result = (char**)(malloc(sizeof(char*) * result_size)); 17 18 char buf[LEN + 1]; 19 memset(buf, '\0', sizeof(buf)); 20 21 int count = 0; 22 char ** dp = &result[0]; 23 while(1) { 24 int i = count; 25 for (int k = 0; k < LEN; k++, i /= LEN) { 26 buf[LEN - k - 1] = CHARS[i % LEN]; 27 } 28 if (i > 0) { // 指定桁を超えた 29 break; 30 } 31 32 if (n > result_size) { 33 result_size *= 2; 34 result = (char**)(realloc(result, sizeof(char*) * result_size)); 35 } 36 result[count++] = strdup(buf); 37 } 38 39 show_result(result, count); 40 return 0; 41}

投稿2019/10/12 01:27

katoy

総合スコア22324

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

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

0

N進数M桁のカウンター(悪ノリ)

C++

1#include <iostream> 2#include <array> 3#include <vector> 4#include <algorithm> 5 6template<int N> 7class digit { 8 int value_; 9public: 10 digit() : value_(0) {} 11 int value() const { return value_; } 12 int increment(int carry) { 13 value_ += carry; 14 carry = value_ / N; 15 value_ %= N; 16 return carry; 17 } 18}; 19 20template<int N, int M> 21class counter { 22 std::array<digit<N>,M> digits; 23public: 24 int increment() { 25 int carry = 1; 26 for ( auto& d : digits ) { 27 carry = d.increment(carry); 28 if ( carry == 0 ) break; 29 } 30 return carry; 31 } 32 std::array<int,M> value() const { 33 std::array<int,M> result; 34 std::transform(digits.begin(), digits.end(), result.begin(), 35 [](const digit<N>& d) { return d.value(); }); 36 return result; 37 } 38}; 39 40int main() { 41 counter<4,4> c; 42 std::array<int,4> result; 43 int count = 0; 44 do { 45 result = c.value(); 46 std::for_each(result.rbegin(), result.rend(), [](int n) { std::cout << n;} ); 47 std::cout << std::endl; 48 ++count; 49 } while ( c.increment() == 0 ); 50 std::cout << count << " numbers generated\n"; 51}

投稿2019/10/11 11:00

episteme

総合スコア16612

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問