当你输入信用卡号码的时候,有没有担心输错了而造成损失呢?其实可以不必这么担心,因为并不是一个随便的信用卡号码都是合法的,它必须通过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
程序输出:成功

解决方案 »

  1.   


    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("失败");
    }
    }
    }
      

  2.   


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

  3.   

        public void check(String id){
            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");
        }
      

  4.   


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

  5.   

    Sorry,没考虑周全,突然意识到:sum += (i % 2 == 0) ? (n * 2) % 9 : n;    // 根据不同的算法累加奇偶位上的数
    这句代码有误!原因是当n == 9 时,n*2 % 9 == 0,按照题意应该是9,所以修改为:sum += (i % 2 == 0) ? ((n *= 2) > 9 ? n - 9 : n) : n; // 根据不同的算法累加奇偶位上的数偶位上的数
      

  6.   


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