poj1023 (binary)

         给你一个数可能是正数,也可能是负数。求其给定的二进制形式,即事先规定某一位是正值还是负值;初始化时,若给的是负值,只要求其相反数,同时也把题目的要求取反,即p改成n,n改成p;然后根据二进制的性质,如果给的数k是奇数,则其二进制形式的最低位一定是1(不管其是p位还是n位),所以先对k-1或是k+1,然后右移一位,同样判断是偶数还是奇数,是偶数的话最低位就为零了,这时只要对k右移一位即可;这样一直下去,如果在给定二进制长度内不能使k变为0,则说明impossible。否则输出res[]即可;

网上的代码;

#include<cstdlib>
#include<iostream>
using namespace std;

int main(){
    int N;
    int n;
    char pn[65] = {'\0'};
    char ans[65] = {'\0'};
    long long y;
    unsigned long long x;
    
    cin >> N;

    for(int i = 0 ; i < N; i ++){
        
        cin>>n>>pn>>y;
        x = y;
        if(y < 0){                
            x = -x;    
            
            for(int j = 0; j < n; j ++)    
if(pn[j] == 'n') pn[j] = 'p'; else pn[j] = 'n'; } for(int j = n - 1; j >= 0; j --){ if(x&1 == 1){ ans[j] = '1'; if (pn[j] == 'p') x = x - 1; else x = x + 1; x = x >> 1; } else{ ans[j] = '0'; x = x >> 1; } } if(x != 0) cout<<"Impossible\n"; else cout<<ans<<endl; memset(ans, '\0', sizeof(char)*65); } return 0; }
原文地址:https://www.cnblogs.com/orangeblog/p/2457339.html