★ 实验任务
上回说到,你奔走于各个世界线拯救静静。现在,完成任务的你决定玩个简单的游戏静
一静。我们知道,数字在计算机里是用二进制存储的,现在你想知道如果把一个数字的二进
制倒过来是多少。,比如 int a = 5,用二进制表示就是 00000000000000000000000000000101。
把它倒过来就是 10100000000000000000000000000000,对应的十进制就是 2684354560。
★ 数据输入
输入第一行为一个数 N,代表一共有 N 个数要处理。0 接下去有 N 个 32 位整数
★ 数据输出
对于每个数,输出二进制逆序后对应的十进制的值是多少
int 的。
输入示例
5
0
1
2
3
4 输出示例
2147483648
1073741824
3221225472
536870912
[解题思路]
首先我们想到的是将一个数转化为二进制,再反过来转化为十进制数,对应的代码为:
[代码]
#include
#include
int main(){int n;scanf("%d",&n);while(n--){unsigned int sum=0,m;scanf("%d",&m);unsigned int a[32]={0};int k=0;while(m){int temp=m%2;m/=2;a[k++]=temp;}for(int i=31,j=0;i>=0;i--,j++){unsigned int t=pow(2*a[i],j);sum+=t;}printf("%u\n",sum);}
}
这样的话,对于时间的要求就会很高,这时候我们考虑到要优化代码:
我们知道
a[n]*(2^n)+a[n-1]*(2^n-1)+a[n-2]*(2^n-2)+......+a[2]*(2^2)+a[1]*(2^1)+a[0]*(2^0)=a[n]*2{a[n-1]*2{a[n-2]*2{......}}}
所以我们可以从里面到外面进行处理这个问题
[代码]
#include
unsigned change(int n);
int main()
{int num;scanf("%d",&num);while(num--){int n;unsigned m;scanf("%d",&n);m=change(n);printf("%u\n",m);}
}unsigned change(int n)
{int i=31;unsigned a[32]={0};unsigned sum=0;while(n){a[i]=n%2;n/=2;i--;}//用a[32]存储该数的二进制数for(i=31;i>0;i--){sum=a[i]*2;a[i-1]+=sum;}return sum;
}