POJ1023 The Fun Number System【进制相关】

题目链接:

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;
}

猜你喜欢

转载自blog.csdn.net/u011676797/article/details/48530971