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

And*_*ner 7 java algorithm

请参阅"制作基本算法"的编辑历史记录.当OP改变问题,使一些有趣的答案失效时,受访者之间有一种明显的失望感.所以,我想,为什么不再问原始问题,让这些答案成立.

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

if(size == 2)  unit /= 2;
if(size == 2 || size == 6) unit /= 2;
if(size == 2 || size == 6 || size == 10) unit /= 2;
Run Code Online (Sandbox Code Playgroud)

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

我需要达到256.

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

And*_*ner 9

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

size % 4 == 2
Run Code Online (Sandbox Code Playgroud)

那么有多少次除以unit2 的问题.对于上面的例子:

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

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

unit >>= 1 + (10 - size) / 4
Run Code Online (Sandbox Code Playgroud)

或者,更一般地说:

unit >>= 1 + (max_number - size) / 4
Run Code Online (Sandbox Code Playgroud)

哪里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;
}
Run Code Online (Sandbox Code Playgroud)

实际上,条件可以更简洁地表达(但无疑可读性更低):

if ((size & 0xffffff03) == 2)
Run Code Online (Sandbox Code Playgroud)

正如@PaulBoddington所指出的那样,需要注意右移的大小:如果单位是a int并且移位的位数大于31,那么unit应该简单地设置为零.