制作基本算法 - 更有趣的版本

时间:2016-04-13 18:29:44

标签: java algorithm

查看"Making a basic algorithm"的修改历史记录。当OP改变问题,使一些有趣的答案失效时,受访者之间有一种明显的失望感。所以,我想,为什么不再问原问题,让这些答案成立。

  

所以基本上我想找到一种更简单的方法:

if(size == 2)  unit /= 2;
if(size == 2 || size == 6) unit /= 2;
if(size == 2 || size == 6 || size == 10) unit /= 2;
     

所以基本上它检查大小是否等于2,然后每个新行添加4到最后一次大小检查。

     

我需要达到256。

     

我想知道是否有一种简单的方法可以做到这一点。

1 个答案:

答案 0 :(得分:9)

这里检查相等的数字的基本标准是size / 4的余数为2.这可以使用模运算符%来检测:

size % 4 == 2

然后问题是将unit除以2的次数。对于上面的例子:

  • 对于size == 2unit /= 8(匹配所有3个条件);
  • 对于size == 6unit /= 4(匹配后两个条件);
  • 对于size == 10unit /= 2(匹配最后一个条件)。

因此数字越小,除以8的次数越多。如果选中的最大size为10,则unit除以2 ^ (1 + (10 - size) / 4)。这可以使用右移运算符简洁地表达:

unit >>= 1 + (10 - size) / 4

或者更一般地说:

unit >>= 1 + (max_number - size) / 4

其中max_number % 4 == 2

设置max_number = 254(问题中指定了256,但表达式中没有指定功能;检查的最后一个数字是254),并注意到我们仅在2 <= size <= 254时才应用此功能,我们可以将最终答案表达为:

if (size % 4 == 2 && size >= 2 && size <= 254) {
  unit >>= 1 + (254 - size) / 4;
}

实际上,这种情况可以更简洁地表达(但无疑更不易读):

if ((size & 0xffffff03) == 2)

如@PaulBoddington所述,需要注意右移的大小:如果单位是int并且移位的位数大于31,那么unit应该只是设置为零。