题目:
描述
在ak位2的补码数中,其中位从0到k-1被索引,最高有效位(即位置k-1)的权重是-2 ^(k-1),并且权重为在任何位置i(0≤i<k-1)的位是2 ^ i。例如,3比特数101是-2 ^ 2 + 0 + 2 ^ 0 = -3。负加权位称为negabit(例如2的补码数中的最高位),而正加权位称为posibit。
Fun数字系统是位置二进制数系统,其中每个位可以是negabit或posibit。例如,考虑一个3位有趣数字系统Fun3,其中位置0和2中的位是posibits,位置1中的位是negabit。 (110)Fun3被评估为2 ^ 2-2 ^ 1 + 0 = 3.现在,您将享受Fun数字系统的乐趣!给你一个k位有趣数字系统Funk和一个整数N(可能是负数)的描述。你应该确定Funk中N的表示的k位,或者报告不可能代表给定的N in给定的Funk。例如,Fun3号码系统(上面定义)中-1的表示是011(评估为0-2 ^ 1 + 2 ^ 0),并且
在Fun3中代表6是不可能的。
输入
输入文件的第一行包含一个整数t(1≤t≤10),测试用例的数量,后跟每个测试用例的输入数据。每个测试用例分三个连续给出。在第一行中有一个正整数k(1≤k≤64)。在测试数据的第二行中,存在长度为k的字符串,仅由字母n和p组??成,描述该测试数据的Fun数系统,其中每个n(p)表示该位置中的位是a negabit(posibit)。
每个测试数据的第三行包含一个整数N(-2 ^63≤N<2 ^ 63),要在Funk编号中表示的数字
系统由您的程序。
输出
对于每个测试数据,您应该打印一行,其中包含表示Funk编号系统中给定数字N的k位字符串,或者当不可能表示给定数字时,单词Impossible。
样例输入
2 3 pnp 6 4 ppnn 10
样例输出
Impossible 1110
#include<cstdio> #include<cstring> int main() { int cas; scanf("%d",&cas); char s[100]; int d[100]; bool a[100]; while(cas--) { int k; scanf("%d",&k); scanf("%s",s); for(int i=k;i>=1;i--) if(s[k-i]==‘p‘) a[i]=true; else a[i]=false; __int64 n; scanf("%I64d",&n); memset(d,0,sizeof(d)); for(int i=1;i<=k;i++) { if(n==0) continue; if(n&1) { d[i]=1; if(a[i]) n=(__int64)(n-1)>>1; else n=(__int64)(n+1)>>1; } else { d[i]=0; n=(__int64)n>>1; } } if(n==0) { for(int i=k;i>=1;i--) printf("%d",d[i]); printf("\n"); } else printf("Impossible\n"); } return 0; }
来源:https://blog.csdn.net/hqd_acm/article/details/6212599
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。