【数论 / 数值】【RQNOJ】隐藏的磁盘

题目描述

小雄把自己的磁盘隐藏了,但他忘记了究竟隐藏了哪几个磁盘,但他还记得隐藏磁盘时设置的那个值,于是,他想到了让你帮助他根据那个值计算出是哪些磁盘被隐藏了。

这个值是这样设定的:默认情况下,系统定义A盘为第0个磁盘、B盘为第1个磁盘、C盘为第2个磁盘,依次类推。
如果要隐藏第k个磁盘,就要把这个值设为 2的k次方 这个数。
例如,要隐藏D盘,就要把这个值设为8(8=2^3);
当然,也可以一次隐藏多个磁盘,计算方法是:依次求出每个磁盘对应的值,然后相加。
比如,要隐藏B、E、F盘,就要把这个值设为50(2^1+2^4+2^5)。
如果这个值是0,那么说明没有任何磁盘被隐藏。
你的任务是:编写一个程序,读入n个这样的值,输出哪个磁盘被隐藏了。

输入格式

测试数据的第一行是一个n。
之后有n行,每行只有一个数字a,代表这个值。
对于每组测试数据,1<=n<=10。
对于每一个值,-maxlongint<=a<=maxlongint。

输出格式

共输出n行。
被隐藏的盘符按字典顺序输出。
输出的盘符一定要使用大写字母,否则错误。
每个大写字母之间要有一个空格,最后一个字母后面不要有空格。
如果遇到错误的值或者没有磁盘被隐藏,就输出“None”。

样例输入

3 12 14 -2

样例输出

C D B C D None

三维状态图像

 


 

#include int a[26]={1,2,4,8,16,32,64,128,256,512,1024,2048,4096,8192,16384,32768,65536,131072,262144,524288,1048576,2097152,4194304,8388608,16777216,33554432}; int ans[100],len; unsigned long long n,nn; int main() { scanf("%d",&n); for (int i=0;i=0;--j) if (nn>=a[j]) { ans[++len]=j; nn-=a[j]; } if (nn!=0) printf("None/n"); else { for (int j=len;j>1;--j) printf("%c ",ans[j]+'A'); printf("%c/n",ans[1]+'A'); } } return 0; }

你可能感兴趣的:(RQNOJ,数论,/,数值)