5.2

Topic 5.2 Given a real number between 0 and 1(e.g.,0.72) that is passed in as a double, print the binary representation. If the number cannot be represented accurately in binary with at most 32 characters, print “ERROR”.

很神奇。这个题的要求是把0.375打印成 0.011.

系统里面处理本来就是二进制的,输出是十进制,现在是把系统的二进制用字符串的形式显示出来。

方法: r=210*0.1012=1*20+ 0*2-1 +1*2-2=1.012.

 If r>=1, 那么第一位就是1,在arrayBuilderappend 1. 然后用-1把这一位去掉. By doing this continuously, we can check every digit.

public class c5_2 {
	public static String printBinary(double num) {
		if (num >= 1 || num <= 0) {
			return "ERROR";
		}
		
		StringBuilder binary = new StringBuilder();
		binary.append(".");
		while (num > 0) {
			/* Setting a limit on length: 32 characters */
			if (binary.length() > 32) {
				return "ERROR";
			}
			double r = num * 2;
			if (r >= 1) {
				binary.append(1);
				num = r - 1;
			} else {
				binary.append(0);
				num = r;
			}
		}
		return binary.toString();
	}

	public static void main(String[] args) {
		String bs = printBinary(.125);
		System.out.println(bs);

		for (int i = 0; i < 1000; i++) {
			double num = i / 1000.0;
			String binary = printBinary(num);
			if (!binary.equals("ERROR")) {
				System.out.println(num + " : " + binary );
			}
		}
	}	
}
//结果
.001
0.125 : .001
0.25 : .01
0.375 : .011
0.5 : .1
0.625 : .101
0.75 : .11
0.875 : .111



 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值