Luhn算法实现时数组整数拆分相加结果异常问题求助
问题根因
你遇到的异常本质是char类型变量直接参与数值运算时使用的是ASCII编码值,而非字符对应的数字本身。ASCII编码规则中,字符'0'的对应数值是48,'1'为49,一直到'9'对应57。你直接拿temp2.charAt(0)赋值或相加时,实际计算的是字符的ASCII值:
- 比如字符
'4'的ASCII值是52,直接赋值就会出现预期得到4、实际得到52的问题 - 比如字符
'1'和'2'的ASCII值相加是49+50=99,就会出现无意义的大数结果
修复方案
你只需要在取到字符后减去'0',就能转换得到字符对应的数字值,修改后的对应代码片段如下:
if (temp2.length() == 1) { System.out.println("Temp2 char 0: "+ temp2.charAt(0)); // 减去'0'将字符转为对应数字 tempSum = temp2.charAt(0) - '0'; System.out.println("This is tempSum == 1: " + tempSum); } else { System.out.println("TEMP2 char 0 and char 1: " + temp2.charAt(0) + " " + temp2.charAt(1)); // 两个字符分别转数字后再相加 tempSum = (temp2.charAt(0) - '0') + (temp2.charAt(1) - '0'); System.out.println("This is tempSum != 1: " + tempSum); }
可选优化
你也可以不用转字符串处理数位相加,Luhn算法里双倍后大于等于10的数值,数位相加的结果等价于原数值减9:比如12的数位和是1+2=3,12-9=3;18的数位和是1+8=9,18-9=9,处理逻辑可以简化为:
int temp = cardNumber[i] * 2; tempSum = temp >= 10 ? temp -9 : temp;
不用做字符串转换,运行效率更高,也不会出现字符编码相关的问题。
内容的提问来源于stack exchange,提问作者Cameron Fox
相关产品推荐
相关产品推荐

