有时,当我懒散地尝试考虑出现在我面前的数字时,过了一会儿,我意识到这比我想象的要容易。就拿2156
例如:它最终发生,我认为这两个21
和56
是的倍数7
,所以肯定2156 = 21 x 100 + 56
也是一个倍数7
。
您的任务是编写一些代码,以标识由于此类巧合而更易于分解的数字。
更确切地说:
编写一个程序或函数,将正整数n
作为输入,如果存在一个除数d
(大于1
),n
可以将其切成两个以产生两个正整数,每个整数都是的倍数d
;然后返回一个真值。否则返回假值。
- “切成两半”表示您的想法:通常的以10为底的表示形式
n
在某个点划分为前半部分和后半部分,以产生另外两个以10为底的整数。如果第二个整数的前导零是可以的(但请注意,它必须是一个正整数,所以拆分1230
为123
和0
无效)。 - 真实值和虚假值可以取决于输入。例如,如果在您选择的语言中有任何非零整数是真实的,那么欢迎您返回除数
d
或“ 的除数”之一n
(或n
就此而言)。 - 例如,集合中至少有两位数字的任何偶数
{2, 4, 6, 8}
都会产生真实值:只需在第一个偶数之后将其分割即可。同样,例如,任何质数n
都会产生伪造的值,任何一位数字也会产生伪造的值。 - 注意,考虑素数除数就足够了
d
。 - 您可以假定输入有效(即正整数)。
这是code-golf,因此以字节为单位的最短代码获胜。但是欢迎使用所有语言的解决方案,因此我们可以争取使用每种语言的最短代码,而不仅仅是整体上最短的代码。
测试用例
(您只需要输出一个真实值或虚假值;下面的注释仅是为了说明。)产生真实值的一些输入是:
39 (3 divides both 3 and 9)
64 (2 divides both 6 and 4)
497 (7 divides both 49 and 7)
990 (splitting into 99 and 0 is invalid; but 9 divides both 9 and 90)
2233 (11 divides both 22 and 33)
9156 (3 divides both 9 and 156; or, 7 divides both 91 and 56)
11791 (13 divides both 117 and 91)
91015 (5 divides both 910 and 15)
1912496621 (23 divides both 1912496 and 621; some splittings are multiples of 7 as well)
9372679892 (2473 divides both 937267 and 9892; some splittings are multiples of 2 as well)
产生虚假值的一些输入是:
52
61
130 (note that 13 and 0 is not a valid splitting)
691
899
2397
9029
26315
77300 (neither 7730 and 0 nor 773 and 00 are valid splittings)
2242593803
¹是,我确实做到了