分析:
本题还需要处理多组测试数据,而且是第一种输入情形
本题涉及到十进制数转换成二进制数。方法是,对输入的整数,反复对2取余,得到的是当前的二进制位上的数字,然后将n除以2;如此反复直至n变为0。在这个过程中,用变量pos充当计数器,代表二进制位,如果得到的余数为1,则输出pos,否则不输出。pos的初值为0,每次将n除以2后,pos自增1
注意,有些竞赛题目对输出要求非常严格。例如,本题在输出时要求每两个位置之间有1个空格,最后一个位置后面没有空格。但是我们并不知道要输出多少个位置。解决方法是:引入状态变量first,表示第1个输出的位置,初值为true;在输出pos前,先判断first的值是否为true,如果是则将first的值改为false,否则才输出一个空格。这样就做到了第1个位置之前不输出空格,然后在接下来的所有数码“1”的位置之前输出一个空格
代码如下:
#include<iostream>
using namespace std;
int main()
{
int d, n; cin >> d;
int pos = 0; bool frist = true;
while(d--){
cin >> n; //需要处理的正整数
pos = 0; //二进制位(最低位为第0位)
frist = true; //是否为第一个要输出的位置
while(n>0){
if(n%2==1){
if(frist) frist = false;
else cout << " ";
cout << pos;
}
n = n/2; pos++;
}
cout << endl;
}
return 0;
}