当你输入信用卡号码的时候,有没有担心输错了而造成损失呢?其实可以不必这么担心,因为并不是一个随便的信用卡号码都是合法的,它必须通过Luhn算法来验证通过。
该校验的过程:
1、从卡号最后一位数字开始,逆向将奇数位(1、3、5等等)相加。
2、从卡号最后一位数字开始,逆向将偶数位数字,先乘以2(如果乘积为两位数,则将其减去9),再求和。
3、将奇数位总和加上偶数位总和,结果应该可以被10整除。
例如,卡号是:5432123456788881
则奇数、偶数位(用红色标出)分布:5432123456788881
奇数位和=35
偶数位乘以2(有些要减去9)的结果:1 6 2 6 1 5 7 7,求和=35。
最后35+35=70 可以被10整除,认定校验通过。请编写一个程序,从键盘输入卡号,然后判断是否校验通过。通过显示:“成功”,否则显示“失败”。
比如,用户输入:356827027232780
程序输出:成功
import java.util.Scanner;
public class CardCheck {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
System.out.println("请输入你的信用卡号:");
String cardNo = input.next();
if(isNumber(cardNo)) {
check(cardNo);
} else {
System.out.println("信用卡号只由数字组成!");
}
}
//检查卡号是否全部是数字
private static boolean isNumber(String cardNo) {
boolean flag = true;
char ch;
for(int i=0; i<cardNo.length(); i++) {
ch = cardNo.charAt(i);
if(!(ch >= '0' && ch <='9')) {
flag = false;
break;
}
}
return flag;
}
private static void check(String cardNo) {
int odd = 0,even = 0;
char ch;
int num;
//首先翻转卡号,便于后面的操作
cardNo = new StringBuffer(cardNo).reverse().toString();
//计算奇数位和偶数位的和
for(int i=0; i<cardNo.length(); i++) {
ch = cardNo.charAt(i);
if((i + 1) % 2 == 0) {
num = (ch - '0') * 2;
if(num >= 10) {
num -= 9;
}
even += num;
} else {
odd += (ch - '0');
}
}
num = odd + even;
if(num % 10 == 0) {
System.out.println("成功");
} else {
System.out.println("失败");
}
}
}
public class Test1 {
public static void main(String[] args) throws Throwable {
byte[] readBytes = new byte[18];
System.out.print("Input Card Number: ");
int length = System.in.read(readBytes);//输入没有校验!!!
int odd = 0;
int even = 0;
int tmp;
for (int i = length, index = 0; i >= 0; i--) {
if (readBytes[i] == 0 || readBytes[i] == 10 || readBytes[i] == 13) continue;
index++;
if (index % 2 == 0) {
tmp = (readBytes[i] - '0') * 2;
if (tmp > 9) tmp -= 9;
even += tmp;
} else
odd += readBytes[i] - '0';
}
tmp = odd + even;
if (tmp % 10 == 0)
System.out.println("successful");
else
System.out.println("failed");
}
}
System.out.println("判定是否是一个合法的银行卡密码");
int length = id.length();
int a = 0,b = 0;
boolean isA = true;
for(int i = length; i > 0 ;i--){
if(isA){
a += id.charAt(i-1) - '0';
}else{
int c = (id.charAt(i-1) - '0') *2;
b += c > 9 ? c - 9 : c;
}
isA = ! isA;
}
if((a+b) % 10 == 0){
System.out.println("Y");
}else System.out.println("N");
}
import java.util.Scanner;public class LuhnTest
{
public static void main(String[] args)
{
// 输入
System.out.println("请输入卡号:");
String cardNum = new Scanner(System.in).nextLine();
// 业务逻辑:卡号验证处理
boolean isOk = Luhn.verify(cardNum);
// 输出
System.out.println(isOk ? "成功!" : "失败!");
}
}/**
* 卡号验证工具类
*
* @author rr12580
*/
final class Luhn
{
/**
* 由于是工具类,所以不可以实例化
*/
private Luhn()
{
throw new AssertionError();
}
/**
* 使用Luhn算法验证卡号。验证通过返回 true,否则返回false
*
* @param num 卡号
* @return 验证通过返回 true,否则返回false
*/
public static boolean verify(String num)
{
// 累加奇偶位上的数
int sum = 0;
// 从卡号尾部开始
for (int i = num.length() - 1; i >= 0; i--) {
char c = num.charAt(i);
if (!Character.isDigit(c)) {
return false;
}
int n = c - '0';
sum += (i % 2 == 0) ? (n * 2) % 9 : n; // 根据不同的算法累加奇偶位上的数
}
return ((sum % 10) == 0);
}
}
这句代码有误!原因是当n == 9 时,n*2 % 9 == 0,按照题意应该是9,所以修改为:sum += (i % 2 == 0) ? ((n *= 2) > 9 ? n - 9 : n) : n; // 根据不同的算法累加奇偶位上的数偶位上的数
import java.util.Scanner;public class LuhnTest
{
public static void main(String[] args)
{
// 输入
System.out.println("请输入卡号:");
String cardNum = new Scanner(System.in).nextLine();
// 业务逻辑:卡号验证处理
boolean isOk = Luhn.verify(cardNum);
// 输出
System.out.println(isOk ? "成功!" : "失败!");
}
}/**
* 卡号验证工具类
*
* @author rr12580
*/
final class Luhn
{
/**
* 由于是工具类,所以不可以实例化
*/
private Luhn()
{
throw new AssertionError();
}
/**
* 使用Luhn算法验证卡号。验证通过返回 true,否则返回false
*
* @param num 卡号
* @return 验证通过返回 true,否则返回false
*/
public static boolean verify(String num)
{
// 累加奇偶位上的数
int sum = 0;
// 从卡号尾部开始
for (int i = num.length() - 1, j = 1; i >= 0; i--, j++) {
char c = num.charAt(i);
if (!Character.isDigit(c)) {
return false;
}
int n = c - '0';
sum += (j % 2 == 0) ? ((n *= 2) > 9 ? n - 9 : n) : n; // 根据不同的算法累加奇偶位上的数
}
return ((sum % 10) == 0);
}
}