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} 다음의 거 출력처럼 내가 입력을 ...
비교하려는 않는 동시에 ++ C 및 C 태그를 피하십시오/사용을 말할 수 있기 때문에 물론 무의미 : 숫자 및 다음과 같은 작업을 수행 할 수 있습니다 둘 다 – Treycos
요즘에는 메시지가 너무 많아서 "어디서 잘못 됐는지 이해할 수없는 것 같습니다" – NeoR
적절한 메시지가있는 모든 루프의 내부와 외부에 cout 또는 printf를 사용하고 논리적 오류를 찾습니다. – NeoR