题目链接:
http://poj.org/problem?id=1023
题目大意:
给一个长度为 k 的字符串 s,每一位有两种状态,'p'表示该位上的权值为+2^i,'n'表
示-2^i。再给你一个整数 N。求一个 k 位的二进制数,能够通过与字符串 s 对应位置
上的相应变换,最终等于整数 N。
例如:N 为10,字符串 s 为"ppnn"。则所求二进制数为 1110。
变换为 1*2^3 + 1*2^2 - 1*2^1 - 0*2^0 == 10。
解题思路:
已知 N 的二进制为 k 位。从 N 的低位向高位考虑。
若 N 为偶数,则最低位必为 0,无论 s 对应位置是'n'还是'p',对 N 二进制的 k-1 位
没有影响,则 N >>= 1,继续计算 k-1 位。
若 N 为奇数,则最低位必为 1,若 s 对应位置是'n',表示该位 -1,本来应该为+1,
则高位要+1,右移 N >>= 1 之后+1,或者+1之后右移。若 s 对应位置是'p',则该位
本来就是+1,直接右移 N >>= 1 即可。
AC代码:
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
using namespace std;
char s[70];
int main()
{
__int64 N;
int T,k;
scanf("%d",&T);
while(T--)
{
scanf("%d%s%I64d",&k,s,&N);
while(k--)
{
if(N & 1)
{
if(s[k] == 'n')
N++;
s[k] = '1';
N >>= 1;
}
else
{
s[k] = '0';
N >>= 1;
}
}
if(N)
printf("Impossible\n");
else
printf("%s\n",s);
}
return 0;
}