题目大意:有趣的数字系统
在一个k位的2的补码,,位的索引是从0到k-1位的,值是-2^(k-1),其他位置的i是2^i( (0 ≤ i < k-1) ),例如,3位的数字101是-2^2 + 0 + 2^0 = -3,一个负权值叫做一个negabit, 例如最高位的2的补码,一个正的位权值叫做一个possibit。
一个趣味数字系统是一个二进制数字系统,每一位也可以是一个negabit或者一个negabit,例如认为一个3位趣味数字系统趣味3,位在位置0那里,并且2是posibits.
明白了就是先给一个数字说这个数字的二进制有多少位,然后按照给的字符串正负方式能不能得到下面的数,不能就是impossible能就输出那个字符串
需要考虑负数的情况->千万不要忘记
#include<iostream>
#include<string>
using namespace std;
int main()
{
int T;
cin >> T;
while(T--)
{
int i, j, k;
long long m;
int a[100]={0}, b[100]={0};
string s;
cin >> k >> s >> m;
int op=1;
if(m<0)
op=0, m=-m;
for(i=0,j=k-1; i<k; i++, j--)
{
if(s[i] == 'n' && op)
b[j] = 1;
else if(s[i]=='p' && !op)
b[j] = 1;
a[i] = m%2;
m/=2;
}
for(i=0; i<=k; i++)
{
a[i+1] += a[i]/2;
a[i] %= 2;
if(a[i] && b[i])
a[i+1]++;
}
if(a[k] || a[k+1] || m)
cout << "Impossible" <<endl;
else
{
for(i=k-1; i>=0; i--)
cout << a[i];
cout << endl;
}
}
return 0;
}
using namespace std;
int main()
{
int T;
cin >> T;
while(T--)
{
int i, j, k;
long long m;
int a[100]={0}, b[100]={0};
string s;
cin >> k >> s >> m;
int op=1;
if(m<0)
op=0, m=-m;
for(i=0,j=k-1; i<k; i++, j--)
{
if(s[i] == 'n' && op)
b[j] = 1;
else if(s[i]=='p' && !op)
b[j] = 1;
a[i] = m%2;
m/=2;
}
for(i=0; i<=k; i++)
{
a[i+1] += a[i]/2;
a[i] %= 2;
if(a[i] && b[i])
a[i+1]++;
}
if(a[k] || a[k+1] || m)
cout << "Impossible" <<endl;
else
{
for(i=k-1; i>=0; i--)
cout << a[i];
cout << endl;
}
}
return 0;
}