信用卡长/字符串验证[关闭]

Posted

技术标签:

【中文标题】信用卡长/字符串验证[关闭]【英文标题】:Credit Card Long/String Validation [closed] 【发布时间】:2019-01-12 08:23:34 【问题描述】:

我正在处理信用卡号验证应用程序。

我可以输入有效数字或无效数字,但输出永远不会输入数据并将其读取为有效数字。我正在尝试找出验证信用卡的正确算法。

以下是我想要的结果。我需要知道循环的哪一点,或者我对 long 与 string 的使用搞砸了,这会导致输出始终读取为无效。

样本 1:

Enter a credit card number: 4246345689049834

4246345689049834 is invalid

示例 2:

Enter a credit card number: 4388576018410707

4388576018410707 is valid

但是,在我的代码中,我得到以下输出

样本 1:

Enter a credit card number: 4246345689049834

4246345689049834 is invalid

示例 2:

Enter a credit card number: 4388576018410707

4388576018410707 is invalid 

代码:

    public static void main(String args[]) 
        Scanner input = new Scanner(System.in);

        System.out.println("Enter Credit Card Number for Validation: ");
        long number = input.nextLong();

        long total = sumOfEvenPlaces(number) + sumOfOddPlaces(number);

        if (isValid(total)) 
            System.out.println(number + " is valid");
         else 
            System.out.println(number + " is invalid");
        
    

    public static boolean isValid(long total) 
        if (total % 10 == 0) 
            return true;
        
        return false;
    

    public static int sumOfEvenPlaces(long number) 
        int sum = 0;
        int remainder;
        number %= 10;
        while (number % 10 != 0 || number / 10 != 0) 
            remainder = (int) (number % 10);

            sum = sum + getDigit(remainder * 2);
            number /= 100;
        
        return sum;
    

    public static int getDigit(int number) 
        if (number > 9) 
            return (number % 10 + number / 10);
        
        return number;
    

    public static int sumOfOddPlaces(long number) 
        int sum = 0;
        int remainder;

        while (number % 10 != 0 || number / 10 != 0) 
            remainder = (int) (number % 10);
            sum = sum + getDigit(remainder);
            number /= 100;
        
        return sum;
    

【问题讨论】:

What does your step debugger tell you?。 您的问题可以通过您的步进调试器快速轻松地得到解答。在使用 *** 之前,您应该始终尝试使用分步调试器解决您的问题。 如果您要求其他人运行您的代码,请在分步调试器中调试并为您修复它,您应该知道这是不是网站的工作方式。我在其他 cmets 中发布的链接对此进行了解释。 为我调试代码转储也不是问题 【参考方案1】:

sumOfEvenPlaces()sumOfOddPlaces() 方法都有错误。

sumOfEvenPlaces(long number)你必须改变

 number %= 10; 

 number /= 10;

您只能使用数字 / 10 而不是数字 % 10 跳过一个数字

并且在这两个函数中都发生了变化

 while (number % 10 != 0 || number / 10 != 0)

 while (number > 0)

通过使用 while (number > 0) 循环将一直工作,直到处理完 number 中的所有数字。

尝试这些修改后的方法,这会奏效:-

public static int sumOfEvenPlaces(long number) 
    int sum = 0;
    int remainder;
    number /= 10;          // change 1
    while (number > 0)    // change 2
        remainder = (int) (number % 10);
        sum = sum + getDigit(remainder * 2);
        number /= 100;
    
    return sum;


public static int sumOfOddPlaces(long number) 
    int sum = 0;
    int remainder;

    while (number > 0)    // change 3 
        remainder = (int) (number % 10);
        sum = sum + getDigit(remainder);
        number /= 100;
    
    return sum;

输出:-

Enter Credit Card Number for Validation: 
 4246345689049834
4246345689049834 is invalid

【讨论】:

以上是关于信用卡长/字符串验证[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

信用卡验证:卡名可以包含非 ASCII 字符吗?

使用正则表达式验证信用卡号

如何使用 notepad++ 搜索 16 位长字符串(Luhn 算法)?

在 Iphone App 中验证信用卡公式

为啥字符串-字符串连接比字符串长连接更快? [关闭]

js 常用正则表达式表单验证代码