您的位置:首页 > 其它

POJ1023 The Fun Number System【进制相关】

2015-09-17 22:55 239 查看
题目链接:

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: