java - 使用 Luhn 算法检查信用卡

标签 java

我正在尝试用 JAVA 制作一个应用程序来检查用户输入的信用卡号是否有效。

以下是模数 10 检查的步骤:

第一步:从右到左每隔两个数字加倍。如果数字加倍得到两位数,则将这两位数相加得到一位数。

第 2 步:现在添加第 1 步中的所有个位数

第三步:将卡号从右到左奇数位的所有数字相加

第4步:将第2步和第3步的结果相加

第五步:如果第四步的结果能被10整除,则卡号有效;否则无效。在这种情况下,卡号无效 - 因为 75 不能被 10 整除。

到目前为止,我的问题是,我尝试的每个卡号(使用有效号码)都被告知它无效。我尝试使用调试工具,看起来我的 sum 值总是错误的。我需要帮助找出我在计算中搞砸的地方或者我是否遗漏了一些东西。

public class CreditCardChecker {

/**
 * @param args the command line arguments
 */
public static void main(String[] args) {
    // TODO code application logic here
    Scanner sc = new Scanner(System.in);

    System.out.println("Enter credit card number to check validity: ");
    System.out.println();
    String cardNo = sc.next();
    int sum = FindSum(cardNo);

    if ((sum % 10) == 0) {
        System.out.println("The card number is VALID.");
    } else {
        System.out.println("The card number is INVALID");
    }

}

public static int FindSum(String cardNo) {

    //CONVERTING CARD NUMBER INTO AN ARRAY
    int[] digits = new int[cardNo.length()];
    for (int i = 0; i < cardNo.length(); i++) {
        digits[i] = Character.getNumericValue(cardNo.charAt(i));
    }

    //DOUBLE EVERY OTHER NUMBER FROM RIGHT TO LEFT
    for (int i = digits.length - 1; i >= 0; i -= 2) {

        digits[i] += digits[i];

        if (digits[i] > 9) {
            digits[i] = digits[i] - 9;
        }
    }
    int sum = 0;
    for (int i = 0; i < digits.length; i++) {
        sum += digits[i];
    }

    sum *= 9;
    return sum;

}

}

最佳答案

您在执行该步骤时出错:

Step1: double every second digit from right to left. If doubling of a digit results in a two-digit number, add up the two digits to get a single-digit number.

您从信用卡号的最后(第 n)位数字开始迭代,而应该从第(n-1)位数字开始。即改变:

for (int i = digits.length - 1; i >= 0; i -= 2)

for (int i = digits.length - 2; i >= 0; i -= 2)

此外,请记住,您的 FindSum(String cardNo) 方法仅适用于其中不带任何空格的 String(这就是您获取输入的方式) )。

关于java - 使用 Luhn 算法检查信用卡,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52671553/

相关文章:

java - HashSet 加载因子

java - Facebook SDK 4.4.+ |登录后如何 Conceal 注销按钮?

java - 卖出股票的最大利润

Java按钮按住时的外观样式

Java for循环不迭代,在一次迭代后停止方法而不是重复

java - BufferedWriter 表现得很奇怪

java - 如果多次打开 sqlite 则不会检索到数据

java - 将 Angular JS 中的数据作为表单数据发布到 Java REST Web 服务时出现问题

java - 在不更改 src 代码的情况下在 Java 中模拟 Date()

java - 我可以使用 spring @Autowired 依赖注入(inject)来构建一个类的多个实例吗?