我们已经在这里定义了折号。
但是现在我们将定义一个超级折叠数。超级折叠数字是一个数字,如果折叠足够的次数,它将最终小于2的幂。折叠的方法与折叠数问题稍有不同。
折叠算法如下:
以二进制表示
例如5882
1011011111010
将其洒入三个分区。前半部分,后半部分和中间数字(如果它的位数为奇数)
101101 1 111010
如果中间数字为零,则该数字不能折叠
反转后半部分并叠加在前半部分上
010111 101101
将数字添加到位
111212
- 如果结果中有2,则不能折叠该数字,否则新数字是折叠算法的结果。
如果数字可以折叠为连续的一串,则该数字为超级折叠数字。(所有折号也是超级折号)
您的任务是编写一个接受数字的代码,如果该数字是“超级可折叠”数字,则输出一个真实值,否则为“伪造”。您将在程序的大小上得分。
例子
5200
转换为二进制:
1010001010000
分成两半:
101000 1 010000
中间是一个,因此我们继续叠加两半:
000010
101000
添加了它们:
101010
没有二分之一,所以我们继续分成两半:
101 010
折:
010
101
111
结果是111
(十进制为7),所以这是一个超级折叠数。
测试用例
前100个超级折号是:
[1, 2, 3, 6, 7, 8, 10, 12, 15, 20, 22, 28, 31, 34, 38, 42, 48, 52, 56, 63, 74, 78, 90, 104, 108, 120, 127, 128, 130, 132, 142, 150, 160, 170, 178, 192, 204, 212, 232, 240, 255, 272, 274, 276, 286, 310, 336, 346, 370, 400, 412, 436, 472, 496, 511, 516, 518, 524, 542, 558, 580, 598, 614, 640, 642, 648, 666, 682, 704, 722, 738, 772, 796, 812, 852, 868, 896, 920, 936, 976, 992, 1023, 1060, 1062, 1068, 1086, 1134, 1188, 1206, 1254, 1312, 1314, 1320, 1338, 1386, 1440, 1458, 1506, 1572, 1596]
3
再次潜入测试用例?我看不到如何折叠,因为它会拆分成1 1
,立即给出一个2
。还是您说将其折叠零次也很重要?