hiho一下第157周《Binary Fractions》题目分析

5
0

《二进制小数》题目分析

十进制小数转二进制小数我们可以模拟“乘2减1”的手算过程。例如对于0.6875,这个“乘2减1”的过程是这样的,每次将当前小数乘以2,如果结果大于等于1,那么将结果减1:

 0.6875
x     2
=1.375    减去整数部分    1

 0.375
x    2
=0.75     减去整数部分    0

 0.75
x   2
=1.5      减去整数部分    1

 0.5
x  2
=1.0      减去整数部分    1

 0        结束

经过4次“乘2减1”的操作,结果变为0。我们依次减去的整数部分是1011,所以对应的二进制小数就是0.1011。

假设X的小数部分有N位,如果我们经过N次操作结果仍不为0,那么X就不能表示成有限位数的二进制小数。

考虑到X的小数部分可能有100位,我们实现这个模拟手算的过程需要用“高精度”计算的方法:用一个数组去保存每一位数字,然后按位进行乘以2的操作。

5 answer(s)

3

java美滋滋

3

其实很多情况都可以直接输出NO的。

对于一个十进制数, 判断最后一个有效数字是不是5。 不是的话直接输出NO就好了。

  • 是5也不一定,如0.005,不能表示成二进制,不是5倒可以直接输出

  • 主要是可以一直判断下去,比如倒数第二个数必须是2或者7这种×2个位会是4的,不过一直这么推下去就没边了,所以感觉还是只考虑最后一位,剩下的慢慢来比较好

  • 添加评论
  • reply
0

做这道题的时候把它当作一个小数点后位数比较多的字符串来考虑
设小数部分有k位 则将小数右移k位为x 并将算出y=5^k 然后设ans=x/y
若无法整除则无解 否则考虑将ans还原为二进制结果
你可能需要一个大整数类实现 - * > 嗯 对
应该是可以做的吧?(我没有写 只是口胡的……别打我……

1

二进制表示小数其实就是1/2+1/4+1/8+1/16……的另一种形式。对于要判断的小数x,存在最简分数a/b=x,a、b都是正整数。如果log2(b)是正整数,那么x就可以用有限位二进制小数表示。

0

java大法好

write answer 切换为英文 切换为中文


转发分享