热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

我想静静3

★实验任务上回说到,你奔走于各个世界线拯救静静。现在,完成任务的你决定玩个简单的游戏静一静。我们知道,数字在计算机里是用二进制存储的&#x
★ 实验任务
上回说到,你奔走于各个世界线拯救静静。现在,完成任务的你决定玩个简单的游戏静
一静。我们知道,数字在计算机里是用二进制存储的,现在你想知道如果把一个数字的二进
制倒过来是多少。,比如 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;
}




推荐阅读
author-avatar
mobiledu2502921107
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有