有趣的题目(进制转换)

昨天比赛遇到一道进制转换题,叫有趣的题目,择日不如撞日,不如借此给你们讲讲进制转换类题目的解法.

有趣的题目
Description

小伙子玩过2017codeforces的愚人节场吗~?
wx非常无聊,整天就知道吃饭睡觉打洞洞,于是乎他又给自己找了一个乐子,他随手写一个十进制的数字,请问这个数字的十六进制中有多少个洞?

Input

第一行有一个整数T,代表有T组数据,对于每组数据有一个整数n,占一行。(n<2000000000)
Output

对于每组数据,请输出一个整数,占一行,这个整数代表题目所求的答案.

Sample Input
2
61441
11
Sample Output
2
2
如题,我们要做的的第一步是将10进制数字装换成16进制,接下来的步骤就比较简单了.
首先我们由浅入深,讲讲10进制转2进制.假如我没记错,10进制转2进制是我的高中数学老师教会我的,相信你们的老师也同样教过.不过不会也没关系.接着往下看。
首先我们知道10进制里面是逢十进一,而每一个数可以写成10的幂相加的形式,比如:12345=10^4*1+10^3*2+10^2*3+10^1*4+10^0*5.
OK,现在我们再看2进制的数字,比如1011001,我们已经知道,2进制的数字都可以写成2的幂相加的形式,就像十进制一样,所以1011001(2)=2^6*1+2^5*0+2^4*1+2^3*1+2^2*0+2^1*0+2^0*1,这一堆加起来就等于89.
那么我们现在知道了2进制转10进制,那么10进制怎么转二进制呢?继续讲89这个数.一般我们从末位开始算,89/2=44余1,记下这个1,然后44/2=22,然后22/2=11,11/2=5余1,5/2=2余1,2/2=1,1/2=0余1,然后我们再看看刚刚的得到的余数:1011001,和之前的数一样,证明这个方法在数学上行得通,那么在C语言中实现能不能行呢?因为我们每一个分步骤的做法是基本一致,并且步数是有限的,所以在C语言上实现是不会有问题的,具体代码不写出来,由各位自己参透,自己想出来的才是你们的.
那么我们跳出2进制,拓展到16进制甚至任意进制行不行?当然没问题!只需要把除数换成想要的数字即可,这里不再赘述.
那么回到题目,我们得到16进制的数字之后任务就比较简单了,只需要数一下有多少个洞就行,顺便提醒下,4有一个洞,而B和8有两个.数完洞洞之后,把答案输出即可.
点个赞吧!O(∩_∩)O~~

  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值