Luhn算法(Java)的信用卡号有效性

时间:2014-10-29 22:52:57

标签: java algorithm luhn

我正在进行一项学校作业,使用Luhn算法检查输入的信用卡号是否有效。

1954年,IBM的Hans Luhn提出了一种验证信用卡号码的算法。该算法可用于确定是否正确输入了卡号或扫描仪是否正确扫描了信用卡。此有效性检查后生成信用卡号,通常称为Luhn检查或Mod 10检查,可以描述如下(例如,考虑卡号4388 5760 1840 2626):

  1. 从右到左加倍每秒。如果数字加倍会产生两位数字,请将两位数相加得到一位数字。

  2. 现在添加步骤1中的所有单位数字:4 + 4 + 8 + 2 + 3 + 1 + 7 + 8 = 37

  3. 在卡号中添加从右到左奇数位的所有数字:6 + 6 + 0 + 8 + 0 + 7 + 8 + 3 = 38

  4. 总结步骤2和步骤3的结果:37 + 38 = 75

  5. 如果步骤4的结果可被10整除,则卡号有效;否则,它无效。例如,号码4388 5760 1840 2626无效,但号码4388 5760 1841 0707有效。

  6. 我需要使用我编写的代码中的方法编写这个程序:

    public class CreditCardValidation {
    
    public static void main(String[] args, long input) {
    
        Scanner numberinput = new Scanner(System.in);
        System.out.println("Enter a credit card number as a long integer: ");
        long cardnumber = numberinput.nextLong();
    
        if (isValid(input) == true) {
            System.out.println(numberinput + " is valid.");
        } else {
            System.out.println(numberinput + " is invalid.");
        }
    
    }
    
    public static boolean isValid(long number){
    
        int total = sumOfDoubleEvenPlace + sumOfOddPlace;
    
        return (total % 10 == 0) && (prefixMatched(number, 1) == true) && 
                (getSize(number)>=13) && (getSize(number)<=16);
    }
    public static int sumOfDoubleEvenPlace(long number) {
    
        int doubledevensum = 0;
        long place = 0;
    
        while (number > 0) {
            place = number % 100;
            doubledevensum += getDigit((int) (place / 10) * 2);
            number = number / 100;
        }
        return doubledevensum;
    }
    
    public static int sumOfOddPlace(long number) {
    
        int oddsum = 0;
    
        while (number <= 9) {
            oddsum += (int)(number % 10);
            number = number % 100;
        }
        return oddsum;
    }
    
    public static int getDigit(int number) {
        if (number <= 9) {
            return number;
        } else {
            int firstDigit = number % 10;
            int secondDigit = (int)(number / 10);
            return firstDigit + secondDigit;
        }
    }
    
    public static boolean prefixMatched(long number, int d) {
    
        if ((getPrefix(number, d) == 4)
                || (getPrefix(number, d) == 5)
                || (getPrefix(number, d) == 3)) {
    
            if (getPrefix(number, d) == 3) {
                System.out.println("\nVisa Card ");
            } else if (getPrefix(number, d) == 5) {
                System.out.println("\nMaster Card ");
            } else if (getPrefix(number, d) == 3) {
                System.out.println("\nAmerican Express Card ");
            }
    
            return true;
    
        } else {
    
            return false;
    
        }
    }
    
    public static int getSize(long d) {
    
        int count = 0;
    
        while (d > 0) {
            d = d / 10;
            count++;
        }
        return count;
    }
    
    public static long getPrefix(long number, int k) {
        if (getSize(number) < k) {
            return number;
        } else {
            int size = (int)getSize(number);
    
            for (int i = 0; i < (size - k); i++) {
                number = number / 10;
            }
            return number;
        }
    }  
    
    }
    

    我刚开始学习如何在两个月前编程,所以我对此很新。该程序不编译,我不知道为什么以及我必须做些什么来解决这个问题。我知道有关于此的相关主题已经发布,我一直在使用this帖子来帮助指导我。有人可以帮助指出学生正确的方向,让我知道我做错了什么吗?

2 个答案:

答案 0 :(得分:1)

你的程序没有编译,因为这一行:

int total = sumOfDoubleEvenPlace + sumOfOddPlace;

由于sumOfDoubleEvenPlacesumOfOddPlace是函数,因此必须使用它们:

int total = sumOfDoubleEvenPlace(number) + sumOfOddPlace(number);

答案 1 :(得分:0)

在函数isValid中,您尝试添加两个不存在的变量。但是,您已将它们定义为函数并将它们用作函数,您必须使用

将它们称为函数
int total = sumOfDoubleEvenPlace(number) + sumOfOddPlace(number);