请参阅"制作基本算法"的编辑历史记录.当OP改变问题,使一些有趣的答案失效时,受访者之间有一种明显的失望感.所以,我想,为什么不再问原始问题,让这些答案成立.
所以基本上我想找到一种更简单的方法来做到这一点:
Run Code Online (Sandbox Code Playgroud)if(size == 2) unit /= 2; if(size == 2 || size == 6) unit /= 2; if(size == 2 || size == 6 || size == 10) unit /= 2;所以基本上它检查大小是否等于2,然后每个新行添加4到最后一个大小检查.
我需要达到256.
我想知道是否有一种简单的方法可以做到这一点.
这里检查相等性的数字的基本标准是剩余的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应该简单地设置为零.
| 归档时间: |
|
| 查看次数: |
133 次 |
| 最近记录: |