x個の数字を持つ配列を持っています:[](長い数字)とchar配列演算[]とx-1の数字。セット[]からの各数字について、そのバイナリフォーム(64ビット)は、数字セット(これらの数字は0から63まで)、1と0はサブセット内にあるかどうかを表します(1 2 4C++ 10進数をバイナリに変換し、演算を使用してから10進数に戻します。
例:10進数5 ---> 000 ... 00101となります。このサブセットは、その中に2つの最後の数字(#63と#61)しか持たないことを意味します。
彼らはサブセット上の操作であるかのように、今、私は[]の操作で取得する文字を使用して、私は彼らとこれらの数字のバイナリで動作するはずですが(私はサブセットが右の言葉であると思います)、これらの操作がされて:
U =再結成---> 101U 010 = 111
A =交差点---> 101 001 = 001
\ = A - B ---> 1110から0011 = 1100
/BA = --->前の
様私は基本的に数字を読んでバイナリにし、それがセットであるかのように使用し、それに応じて操作を使用してから、すべての操作の結果を返します。
私のコード:
include <iostream>
using namespace std;
void makeBinaryVector(int vec[64], long xx)
{
// put xx in binary form in array "vec[]"
int k = 63;
long x = xx;
if(xx == 0)
for(int i=0;i<64;i++)
vec[i] = 0;
while(x != 0)
{
vec[k] = x % 2;
x = x/2;
k--;
}
}
void OperationInA(int A[64], char op, int B[64])
{
int i;
if(op == 'U') //reunion
for(i=0;i<64;i++)
if(B[i] == 1)
A[i] = 1;
if(op == 'A') //intersection
for(i=0;i<64;i++)
{
if((B[i] == 1) && (A[i] == 1))
A[i] = 1;
else
A[i] = 0;
}
if(op == '\\') //A-B
for(i=0;i<64;i++)
{
if((A[i] == 0 && B[i] == 0) || (A[i] == 0 && B[i] == 1))
A[i] = 0;
else
if((A[i] == 1) && (B[i] == 1))
A[i] = 0;
else
if((A[i] == 1) && (B[i] == 0))
A[i] = 1;
}
if(op == '/') //B-A
for(i=0;i<64;i++)
{
if(B[i] == 0)
A[i] = 0;
else
if((B[i] == 1) && (A[i] == 0))
A[i] = 1;
else
if((B[i] == 1) && (A[i] == 1))
A[i] = 0;
}
}
unsigned long setOperations(long sets[], char operations[], unsigned int x)
{
unsigned int i = 1; //not 0, since i'll be reading the 1st number separately
unsigned int j = 0;
unsigned int n = x;
int t;
long a = sets[0];
int A[64];
for(t=0;t<64;t++)
A[t] = 0;
makeBinaryVector(A, a); //hold in A the first number, binary, and the results of operations
long b;
int B[64];
for(t=0;t<64;t++) //Hold the next number in B[], in binary form
B[t] = 0;
char op;
while(i < x && j < (x-1))
{
b = sets[i];
makeBinaryVector(B, b);
op = operations[j];
OperationInA(A, op, B);
i++; j++;
}
//make array A a decimal number
unsigned int base = 1;
long nr = 0;
for(t=63; t>=0; t--)
{
nr = nr + A[t] * base;
base = base * 2;
}
return nr;
}
long sets[100];
char operations[100];
long n,i;
int main()
{
cin>>n;
for(i=0;i<n;i++)
cin>>sets[i];
for(i=0;i<n-1;i++)
cin>>operations[i];
cout<<setOperations(sets,operations,n);
return 0;
}
だから、すべてはイムがこれをしようとする場合を除き、罰金だ:
セット= {5、2、1} 操作= { 'U'、 '\'}
5 U 2は7(111)で、7 1は6(111 - 001 = 110 - > 6)です。 結果は6になりますが、結果が4のように入力すると(? ?)
しかし、もし私が単に{7,1}と{\}を入力すれば、結果は6であるはずです。しかし、もし私最初の{5,2,1}言及したと私は理解したりイムが間違っているものを見るように見えることはできません4.
{U}、そのつもり出力のように私はそれらを入力...
同時にCおよびC++のタグ付けは避けてくださいと言うことができるので、これは当然のことながら無意味です両方とも – Treycos
最後にメッセージがたくさんあります。「どこが間違っているのか理解できないようです」 – NeoR
すべてのループの内側と外側にcoutまたはprintfを使用し、論理エラーを見つけます。 – NeoR