使用luhn算法验证信用卡号

 ACHEn大魔王 发布于 2023-02-08 17:16

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

信用卡号码遵循某些模式.信用卡必须在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. ");
        }

    }
} 

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

撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有