以下のプログラミング割り当てに関する質問があります。luhnアルゴリズムを使用してクレジットカード番号を確認してください
クレジットカード番号は特定のパターンに従います。クレジットカードの有効数字は13〜16桁でなければなりません。それはで開始する必要があります:American Expressカード1954
37•マスターカードのビザカードの
•4
•5
を、IBMのハンスのLuhnは信用を検証するためのアルゴリズムを提案しましたカード番号。このアルゴリズムは、カード番号が正しく入力されたかどうか、またはクレジットカードがスキャナによって正しくスキャンされたかどうかを判断する場合に便利です。ほとんどのクレジットカード番号は、LuhnチェックまたはModulus 10チェックとして一般に知られているこの有効性チェックに続いて生成されます。これは次のように記述できます。例として、カード番号4388576018402625を考えます。
- 右から左に2桁ごとに2桁ずつ2桁です。数字の倍数が2桁の数字になる場合は、2桁の数字を加算して1桁の数字を取得します。
2×2 = 4
2×2 = 4
4×2 = 8
1×2 = 2
6×2 = 12(1+ 2 = 3)
5×2 = 10(1 + 0 = 1)
8×2 = 16(1 + 6 = 7)
4×2 = 8
ステップ1 4 + 4 + 2 +8 +3 + 1 + 7 + 8 = 37
からすべての1桁の数を追加
は、カード番号に右から左に奇数の場所にあるすべての数字を追加
5 + 6 + 0 + 8 + 0 + 7 + 8 + 3 = 37
合計ステップ2及びステップ3 37 + 37 = 74
から結果ステップの結果が10で割り切れる場合は、カード番号が有効です。それ以外の場合は無効です。たとえば、数字4388576018402625は無効ですが、数字4388576018410707は有効なVisaカードです。番号6011000593748745は無効ですが、番号6011000593748746は有効なDiscoverカードです。
次のコードに示すように、私はそれを解決しようとした:
import java.util.Scanner;
public class CreditCardValidation {
public static boolean isValid(long number) {
int total = sumOfDoubleEvenPlace(number) + sumOfOddPlace(number);
if ((total % 10 == 0) && (prefixMatched(number, 1) == true) && (getSize(number)>=13) && (getSize(number)<=16)) {
return true;
} else {
return false;
}
}
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 int sumOfOddPlace(long number) {
int result = 0;
while (number > 0) {
result += (int) (number % 10);
number = number/100;
}
return result;
}
public static int sumOfDoubleEvenPlace(long number) {
int result = 0;
long temp = 0;
while (number > 0) {
temp = number % 100;
result += getDigit((int) (temp/10) * 2);
number = number/100;
}
return result;
}
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;
}
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.print("Enter a credit card number as a long integer: ");
long input = sc.nextLong();
if (isValid(input) == true) {
System.out.println("\n" + input + " is Valid. ");
} else {
System.out.println("\n" + input + " is Invalid. ");
}
}
}
を私の質問は、私が代わりに長い番号を使用してのクレジットカード番号を格納する配列を使用する方法です。
あなたは、私が答えを与えている 'STRING' ... –
を使用することができます今日の明らかに同じ質問の2番目の投稿に - [リンク](http://stackoverflow.com/questions/20740444/check-credit-card-validity-using-luhn-algorithm)を参照してください。 –