2016-10-29 21 views
4

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}、そのつもり出力のように私はそれらを入力...

+0

同時にCおよびC++のタグ付けは避けてくださいと言うことができるので、これは当然のことながら無意味です両方とも – Treycos

+0

最後にメッセージがたくさんあります。「どこが間違っているのか理解できないようです」 – NeoR

+0

すべてのループの内側と外側にcoutまたはprintfを使用し、論理エラーを見つけます。 – NeoR

答えて

4

「2進数に変換する」必要はありません。 「2進数」のようなものはありません。変数に対して操作を実行するだけで済みます。 '|'、及び交差点のために、あなたはビット単位のAND 演算子 '&' を使用することができます

再会ためには、ビット単位のOR 演算子を使用することができます。

このような何か:

if (op == 'A') 
    result = a & b; 
else if (op == 'U') 
    result = a | b; 
else if (op == '\\') 
    result = a - b; 
else if (op == '/') 
    result = b - a; 
+0

ありがとうございます! 何らかの理由で、私は自分の例(0と63の間の数字で、サブセット/ビット演算でチェックする)のように正確に解決する必要があると考えました。あなたは私が "考えることを忘れた"と言うことができると思う...あなたの答えのためにありがとう – Andy

1

使用@ Hugal31の答えに示すように、整数のビット演算子。

整数のサイズは通常64ビットではなく32ビットであることに注意してください。 64ビットシステムの場合、64ビット整数の場合はlong longが必要です。確認するにはsizeofオペレータを使用してください。 intは4バイト(32ビット)で、long longは8バイト(64ビット)です。

宿題などの目的で、ベクトルへの変換は正しいとは限りません。正しい結果が出力されるかどうかテストする必要があります。それ以外の場合は、次のようにします。

void makebinary(int vec[32], int x) 
{ 
    int bitmask = 1; 
    for (int i = 31; i >= 0; i--) 
    { 
     vec[i] = (x & bitmask) ? 1 : 0; 
     bitmask <<= 1; 
    } 
} 

シフト演算子の使用に注意してください。し、次のような何かを行うことができ番号:

int vx[32]; 
int vy[32]; 
makebinary(vx, x); 
makebinary(vy, y); 

int result = 0; 
int j = 1; 
for (int i = 31; i >= 0; i--) 
{ 
    int n = (vx[i] & vy[i]) ? 1 : 0; 
    result += n * j; 
    j <<= 1; 
} 

あなたはちょうどあなたが比較/使用する場合を除き、​​

+0

ありがとう!はい、 私は32の配列を使用する必要があることを知っている、特に全体の関数は長いですが、テキストは明示的に[0、63]の間の数字に代理を言うので、私は準拠しなければならないと思った。彼らの評価者がどのように行動するのか、またはアウトプットかコード全体のみをチェックするかはわかりません。 もう一度あなたの返信のために – Andy

関連する問題