有时,在编写程序时,出于某种原因(例如,密码学),您需要使用质数。我认为有时您也需要使用一个复合数字。有时,至少在PPCG上,您的程序必须能够处理任意更改。而且在方便地提出一个有趣的PPCG问题的情况下,也许甚至您使用的数字也必须能够抵御腐败……
定义
甲合数是一个整数≥4不是素数,即它是两个较小的整数大于1更大的产物抗性bitflip复合数被定义如下:它是其中复合正整数,如果你把它写如果是二进制格式,则位数应尽可能少,您可以更改该位数中的任何一位或两位,并且该数字仍然是合成的。
例
例如,考虑数字84。在二进制中,即1010100
。以下是所有相差不超过2位的数字:
0000100 4 2×2 0010000 16 4×4 0010100 20 4×5 0010101 21 3×7 0010110 22 2×11 0011100 28 4×7 0110100 52 4×13 1000000 64 8×8 1000100 68 4×17 1000101 69 3×23 1000110 70 7×10 1001100 76 4×19 1010000 80 8×10 1010001 81 9×9 1010010 82 2×41 1010100 84 7×12 1010101 85 5×17 1010110 86 2×43 1010111 87 3×29 1011000 88 8×11 1011100 92 4×23 1011101 93 3×31 1011110 94 2×47 1100100 100 10×10 1110000 112 8×14 1110100 116 4×29 1110101 117 9×13 1110110 118 2×59 1111100 124 4×31
第一列是二进制数。第二列是十进制数字。如第三列所示,所有这些数字都是合成的。这样,84是抗位翻转的复合数。
任务
您必须编写以下三个程序或函数之一,以最适合您的语言的形式:
- 一个程序或函数,将非负整数n作为输入,并输出前n个抗位翻转的复合数字。
- 一个程序或函数,将非负整数n作为输入,并输出所有小于n的耐位翻转复合数字(或者,如果您愿意,小于或等于n,即如果bitflip,则可以选择是否在输出中包含n) -)。
- 无需输入,并输出所有可抵抗位翻转的复合数字的程序或函数。(这必须使用一种能够在程序仍在运行时产生输出的输出机制,例如打印到stdout,惰性列表或生成器;您不能只计算整个列表然后进行打印。)
测试用例
这是前几个抗位翻转的复合数字:
84, 184, 246, 252, 324, 342, 424, 468, 588, 636, 664, 670, 712, 730, 934, 958
澄清说明
- 只有您产生的数字才能抵抗位翻转。这不是使程序能够发现它们对位翻转的抵抗力。使用您喜欢的程序本身中的任何数字。
- 您输出的数字不必抵抗“前导零”中的位翻转;想象一下,数字将以最小可能的位数进行存储,并且只有那些位数必须不受翻转的影响。但是,您输出的数字的前1位必须不受位翻转的影响。
- 使用您喜欢的任何产生正确结果的算法;您在此处未获得效率方面的标记。
- 如果可以证明确实有很多抗位翻转的复合数字,则a)取消了对输出格式的限制,并且b)允许对该列表进行硬编码(尽管可能比仅对其进行计算更为冗长)。该规则主要是为了完整性。我不认为这是有意义的。
胜利条件
这是代码高尔夫球,因此,通常,较短的更好。同样,程序的长度将以字节为单位。
n
如果n
耐位翻转,我可以包括在内吗?(即使其“小于或等于n”?)