赛博地牢:乘积谜锁
序章:地精守门
你刚传送进地牢,就看见一只绿皮地精翘着二郎腿坐在石门上。
门上的铭文闪烁着阴森的蓝光:
“从
n开始,找到大于等于它的最小整数,让它的各位数字相乘,能被t整除。
找不到?那就留下来给我当抱枕吧~”
你后背一凉,下意识低头看向腰间——那里挂着一把新手村祖传铁剑,剑身上歪歪扭扭刻着两行字:
while True: 砍
地精顺着你的目光瞟了一眼,噗嗤笑出声来:“哈!又是一个想用暴力枚举硬刚的菜鸟。你想超时吗?你想让服务器冒烟吗?!复杂度懂不懂?!优雅懂不懂?!”
你挠挠头:“等等,你这 n 最大才 100?”
地精脸一僵。
你拔剑出鞘:“那优雅个锤子,看爷暴力!”
第一章:暴力连斩
你的策略简单到让地精想给产品经理打差评:
- 从 n 开始,一个一个数字试。
- 把当前数字拆成各个数位,算它们的乘积。
- 如果乘积能被 t 整除,开门!不然就试下一个。
因为数据范围小得离谱(n ≤ 100),你完全可以像推土机一样碾过去。
def smallestNumber(n: int, t: int) -> int:
while True: # 无限连斩,直到门碎
product = 1
for x in str(n):
product *= int(x)
if product % t == 0: # 哇!金色传说!整除啦!
return n # 门开了,拜拜地精
n += 1 # 没开?下一个数字上来挨砍
你一路砍瓜切菜,地精终于忍不住了:“停停停!!你这什么破算法?就硬砍??你的时间复杂度呢?你的数学直觉呢??”
你手上剑招不停,回头冲他咧嘴一笑:“while True 代表我对暴力学的绝对信仰。数据量小就是可以为所欲为,这是算法界的牛顿第一定律,懂? ”
第二章:带0必杀
地精被你怼得绿脸涨成紫茄子,心态彻底崩了。它从石门上一跃而下,双手结印,浑身冒出红光,脑门上弹出一个明晃晃的状态栏:
【二阶段·狂暴】 技能描述:把数据范围扩到 10⁶ ,让这个嚣张的人类砍到手断!
法阵炸开,石门上的铭文一阵鬼畜般扭曲。地精喘着粗气,嘴角挂着反派专属的歪嘴笑:“来啊!继续暴力啊!10⁶ 的范围,够你砍到版本更新了吧?等着超时吧凡人!”
他双臂交叉,等着看你面露难色、手忙脚乱翻算法书的样子。
你愣了一下,然后仰天长笑:“哈哈哈哈哈——你可真是个小可爱!!” 你擦了擦笑出来的眼泪:“告诉你一个小秘密——从 n 开始往上找,最多试 10 个数字,我的循环自己就结束了。"
“10 次?!”地精尖叫,“10⁶ 的范围你 10 次搞定??你当我是史莱姆吗这么好骗?!”
你指着他的鼻子开始精准输出:
“在一段连续的整数里,每 10 个必定踩到一个个位是 0 的。 而数字里一旦带个 0,乘积直接变成 0——0 能被任何 t 整除!
这个 0,就是我通关的万能钥匙。”
地精低头看了看自己画的狂暴法阵。法阵发出一声闷响——“嘟——",然后像放屁一样散了。
他"扑通"一声跪倒在地,眼神涣散,嘴里念叨着什么"不可能"“带 0 不算"之类的话。
你把铁剑往肩上一扛:“狂暴开完了?那让个路呗?”
第三章:另一扇门
石门轰然碎裂,碎石在半空中化作像素粒子消散——标准的 dungeon 通关特效,你见过一百次了。
你正准备摆个帅气的 pose 等传送门出现,却发现碎石后面露出来的,不是通往下一层的楼梯。
是另一扇门。
一扇通体漆黑、镶着血红纹路的黑曜石门。门缝里渗出暗红色的光,像是什么东西正在门后面缓慢地呼吸。
你凑近一看,门楣上刻着新的铭文,字体比刚才那扇门大了三号,还加粗了——生怕你看不见似的:
【隐藏关卡·已解锁】 给你一个字符串
num,表示一个巨大的整数,和一个整数t。 找出大于等于 num 的最小无零整数,它的各位之积能被t整除。 如果不存在,返回"-1"。
旁边还有一行小字,像是在警告每一个试图忽视它的人:
请睁大你的双眼:该整数 禁止出现数字 0。
违规者——将被地牢意志直接抹除。
你感觉脊背发凉。刚刚的“万能钥匙” 0 被封杀了。
而且这次输入的是字符串,意味着 num 可以是几百位、几千位…甚至 20 万位的天文数字。还可能无解,要返回 “-1”(之前可是保证有解的啊!)
你低头看了一眼手中的铁剑,剑身上那行 while True 还在闪。但你清楚地意识到——面对这扇门,暴力连砍是没用的——对面直接开了物理免疫。
地牢深处传来一声低沉的笑——不是地精那种尖嗓门,是一种浑厚的、带着混响的笑,听起来就像某个退隐多年的魔王被吵醒了午觉,正在翻动自己的技能面板。
你握紧剑柄——寒意顺着指尖爬上来,和黑曜石门渗出的暗红光芒混在一起。
真正的挑战,才刚刚开始。

本作品采用
知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议
进行许可。