luhn算法 java_java – 使用luhn算法验证信用卡号

我对以下编程任务有疑问.

信用卡号码遵循某些模式.信用卡必须在13到16位之间.它必须从:

•4张Visa卡

•5张万事达卡

•美国运通卡37张

1954年,IBM的Hans Luhn提出了一种验证信用卡号的算法.该算法可用于确定是否正确输入了卡号或扫描仪是否正确扫描了信用卡.几乎所有信用卡号都是在此有效性检查后生成的,通常称为Luhn检查或模数10检查,可以描述如下.例如,请考虑卡号4388576018402625.

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

2 x 2 = 4

2 x 2 = 4

4 x 2 = 8

1 x 2 = 2

6 x 2 = 12(1 2 = 3)

5 x 2 = 10(1 0 = 1)

8 x 2 = 16(1 6 = 7)

4 x 2 = 8

>添加步骤1中的所有单个数字

4 4 8 2 3 1 7 8 = 37

>在卡号中从右到左添加奇数位的所有数字

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. ");

}

}

}

我的问题是如何使用数组来存储信用卡号而不是使用长号码.

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值