编程之美读书笔记:将相问题

久闻大名的一本书,现今才买来细细的品读,比较的惭愧啊,废话不多说,开始自己的拜读之旅。由于工作中主要是Java,书中是C++的代码,会尽量的转成Java代码,一来可以更加便于理解,二来那能够敲敲代码,发散一下思维。

从1.2节,将相的问题开始,第一次看到题目,直接的无语了。感觉“代码中只能使用一个字节存储变量”,这个实在难为人,事实上,这个是一个提示的信息。很有一种感悟的说法:最难的那一点,就是最简单的一点。

从这个一个字节入手,就知道了只能使用byte类型,或者int类型,这里就要顺便的复习一下基本类型所占的空间了,利用java代码编写程序,可以很清楚的得到java基本类型的基本的信息:代码放在这里,看看输出的都是什么。

System.out.println("基本类型:byte 二进制位数:" + Byte.SIZE);
System.out.println("最小值:Byte.MIN_VALUE=" + Byte.MIN_VALUE); 
System.out.println("最大值:Byte.MAX_VALUE=" + Byte.MAX_VALUE); //。。。。。。。

从运算得到的结果看,就是byte,表示的数据的话,那么就引出了怎么样使用一个byte来表示循环时的内外两层的数据,把byte分拆,这个我个人认为是一个点,想到了,自然就能想到后面的怎么样把左半边和右半边来读入和存起来。想不到的话,就会坑在在这里。

看到这段代码的时候,自己真的有点感觉到“美”了,呵呵

int i = 81;
while (--i>0) {
if(i/9%3 == i%9%3){  //从这里可以看到"/"运算比较的“慢” 相对于"%"来说那么除的运算可以作为一个外层的循环,而%可以作为一个内层的循环
continue;
}
System.out.println("A = "+(i/9+1)+" B = "+(i%9+1));
}

如果从应用的角度说,我非常希望能够拥有一个良好的注释,不然的话的,对后来者维护来说这个是一个灾难。话说回来,越是精妙的算法,越是比较的难以理解,这个算法就在于利用的:/和%运算之间的关系。

最想看到的却是解法3的代码,一个是算法表述的比较的清晰,另外就是效率也比较的好.很可惜的是Java并不支持,定义一个类的话,开销就比较大了。另外的附上自己从网上找的结合自己的想法改进的一个算法。

//外层循环变量使用i的第4-7位,初始值为0X10 就是16,最大值为0x90。
		//内层循环变量使用i的第0-3位,初始值为b+1,最大值为9。
		for (byte i = 0x10;i < 0x90&&i>0X0; i += 0x10)
		    //(byte) ((i & 0xF0) | (i >> 4)) 把i的前四位复制到i的后四位
		    for (i= (byte) ((i & 0xF0) | (i >> 4)); (++i & 0xF) < 10; )
		      if (((i & 0xF) - (i >> 4)) != 3 && ((i & 0xF) - (i >> 4)) != 6){
		    	  System.out.println("A=" +(i >> 4) + ", B=" + (i & 0xF) +"\n");
			  System.out.println("A=" +(i & 0xF) + ", B=" + (i >> 4) +"\n");//利用对称的性质,这点离算法有点远了
		      }


再者,就是说到了定义一个类的开销,具体的详细说明:http://andyao.iteye.com/blog/146124

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值