2016-10-29 3 views
4

x 숫자가있는 배열이 있습니다. [] (긴 숫자)와 x - 1 숫자가있는 문자 배열 연산 []이 있습니다. 집합 []의 각 숫자에 대해 이진 형식 (64 비트)은 숫자 세트 (이 숫자는 0에서 63까지)와 같고, 1과 0은 하위 세트 내부에 있는지 여부를 나타냅니다 (1 2 4 십진수 5 ---> 000 ... 00101 즉,이 하위 집합은 그 안에 2 개의 마지막 번호 (# 63 및 # 61) 만 포함 함을 의미합니다.C++ 10 진수를 2 진수로 변환 한 다음 연산을 사용하고 십진수로 다시 변환합니다.

지금, 나는 [], 내가 그들과 함께 작업을해야 작업에서 얻을 문자 그들이 하위 집합에 대한 작업이 작업이되고, (나는 부분 집합이 올바른 단어 희망) 인 것처럼 이러한 숫자의 바이너리를 사용하여 :

U = 재결합 ---> 101U 010 = 111

,515,

A = 교차 ---> 101 001 = 001

\ = A - B ---> 1110-0011 = 1,100

/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 U2는 7 (111)이고 7 \ 1은 6 (111-100 = 110-> 6)입니다. 결과는 6이어야하지만 결과가 4 일 때 (? ?)

그러나, 만약 내가 단순히 {7,1}과 {\}를 입력하면 결과는 6이됩니다. 하지만 만약 내가 처음 {5,2,1} 언급 내가 이해하거나 메신저 잘못하고 무엇을 볼 수없는 것 4.

{U} 다음의 거 출력처럼 내가 입력을 ...

+0

비교하려는 않는 동시에 ++ C 및 C 태그를 피하십시오/사용을 말할 수 있기 때문에 물론 무의미 : 숫자 및 다음과 같은 작업을 수행 할 수 있습니다 둘 다 – Treycos

+0

요즘에는 메시지가 너무 많아서 "어디서 잘못 됐는지 이해할 수없는 것 같습니다" – NeoR

+0

적절한 메시지가있는 모든 루프의 내부와 외부에 cout 또는 printf를 사용하고 논리적 오류를 찾습니다. – NeoR

답변

4

"이진수로 변환"할 필요가 없습니다. '이진수'와 같은 것은 없습니다. 변수에 대한 작업 만 수행 할 수 있습니다. '|', 그리고 교차로를 들어, 비트 AND 운영자 & '를 사용할 수 있습니다

재회를 들어, 비트 OR 연산자를 사용할 수 있습니다. 이 같은

뭔가 : @ Hugal31의 대답과 같이 정수에

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

사용 비트 연산자.

정수 크기는 일반적으로 64 비트가 아니라 32 비트입니다. 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; 
} 

그냥 int result = X & Y;

+0

고마워요! 예, 전체 배열이 오랫동안이므로 특별히 32 배열을 사용해야한다는 것을 알고 있지만 텍스트는 [0, 63] 사이의 숫자를 명시 적으로 나타 내기 때문에 필자는이를 준수해야한다고 생각했습니다. 평가자의 행동 방식이나 출력 또는 전체 코드 만 확인하는 것은 알 수 없습니다. 다시 Thakyou 답장을 위해 – Andy