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ページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/10/10 07:55
回答6件
0
ベストアンサー
そのインデックスの数字のビット0からビット7までの2ビットづつ0~3をA~Dに変えればよろしい
#256通りなのね
投稿2019/10/10 07:17
編集2019/10/10 07:20総合スコア88038
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
総合スコア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
総合スコア6851
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総合スコア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
総合スコア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
総合スコア16612
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。