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的操作。

6 answer(s)

3

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

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

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

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

  • 添加评论
  • reply
3

java美滋滋

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大法好

0

include

int main() {
float h; char a[5]; int i,t=1; a[0] = '0'; a[1] = '.'; scanf("%f", &h); for (i = 2; i < 6; i++); { while (h) { if (h > 1.0) { h = h - 1; a[i] ='1'; t++; } else if (2 * h >= 1.0) { h = 2 * h - 1; a[i] ='1'; t++; } else { h = 2 * h; a[i] = '0'; t++; } if(h==0) break;

    }
}
for(i = 0; i <3 ; i++)
{
    printf("%c",a[i]);
}
printf("\n");
return 0;

}

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


转发分享