3

我正在做一项学校作业,使用 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有效。

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

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;
    }
}  

}

我两个月前才开始学习如何编程,所以我对此还很陌生。该程序无法编译,我不知道为什么以及我必须做些什么来解决这个问题。我知道已经发布了类似的主题,我一直在使用这篇文章来帮助指导我。有人可以帮助学生指出正确的方向并让我知道我做错了什么吗?

4

2 回答 2

1

您的程序未编译,因为这一行:

int total = sumOfDoubleEvenPlace + sumOfOddPlace;

因为sumOfDoubleEvenPlaceandsumOfOddPlace是函数,你必须这样使用它们:

int total = sumOfDoubleEvenPlace(number) + sumOfOddPlace(number);
于 2014-10-29T22:57:47.783 回答
0

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

int total = sumOfDoubleEvenPlace(number) + sumOfOddPlace(number); 
于 2014-10-29T23:02:54.803 回答