我发现下面有一个非常清晰的电子表格,可以测试任意长度的数字是否通过 Luhn 算法。但是,我想要一个“超级公式”,将整个计算放在一个单元格中,并沿着一列向下进行。A
信用卡号也是如此,B
只需计算真或假。
测试用例示例:
- 343280696646912 --> 正确
- 343280696646913 --> 错误
- 5106594187457183 --> 正确
- 5106594187457184 --> 错误
计算分布的 Excel 表示例:https://web.archive.org/web/20080906205913/http://www.beachnet.com/~hstiles/bin/luhn.zip
答案1
这是一个计算结果的公式,在最新版本的 Excel 中它无需任何特殊操作即可运行,在早期版本中您需要将其作为数组公式输入(输入后按 CTRL+SHIFT+ENTER)。
C2 中的公式:
=SUM(INT(MID(REPT("0",20-LEN(B2))&B2,ROW($1:$20),1)*(MOD(ROW($1:$20),2)+1)/10)+MOD(MID(REPT("0",20-LEN(B2))&B2,ROW($1:$20),1)*(MOD(ROW($1:$20),2)+1),10))
D2 中的公式(最终结果):
=MOD(SUM(INT(MID(REPT("0",20-LEN(B2))&B2,ROW($1:$20),1)*(MOD(ROW($1:$20),2)+1)/10)+MOD(MID(REPT("0",20-LEN(B2))&B2,ROW($1:$20),1)*(MOD(ROW($1:$20),2)+1),10)),10)=0
怎么运行的:
REPT("0",20-LEN(B2))&B2
生成长度为 20 且以 0 开头的数字ROW($1:$20)
生成 1 到 20 的数字列表(该部分不应更改!)MOD(ROW($1:$20),2)+1
生成交替数字 1 和 2IF(D6<10,D6,INT(D6/10)+MOD(D6,10))
从原始公式来看:对于数字 x:0-9,x = int(x/10) + mod(x,10) 始终为真,因此可以排除此测试
答案2
只是为了为上面列出的 G Sheet 用户的 luhn 检查增加一些额外的清晰度
C 列公式 =ARRAY_CONSTRAIN(ARRAYFORMULA(SUM(INT(MID(REPT("0",20-LEN(B2))&B2,ROW($1:$20),1)(MOD(ROW($1:$20),2)+1)/10)+MOD(MID(REPT("0",20-LEN(B2))&B2,ROW($1:$20),1)(MOD(行($1:$20),2)+1),10))), 1, 1)
D 列公式 =ARRAY_CONSTRAIN(ARRAYFORMULA(IF((MOD(SUM(INT(MID(REPT("0",20-LEN(B2))&B2,ROW($1:$20),1)(MOD(ROW($1:$20),2)+1)/10)+MOD(MID(REPT("0",20-LEN(B2))&B2,ROW($1:$20),1)(MOD(ROW($1:$20),2)+1),10)),10)=0), "有效", "无效")),1, 1)