【问题标题】:Luhn's algorithm [duplicate]Luhn的算法[重复]
【发布时间】:2015-01-01 01:13:01
【问题描述】:

a) 从校验位开始向左移动,计算所有解码数字的总和。 b) 使用整数除以 10 计算和的余数。如果结果不为零,则信用卡号无效。否则,卡号很可能是有效的。

这里有两个例子:

        Card number: 2315778     Card number 1234567
        decode(8, false) = 8     decode(7, false) = 7
        decode(7, true)  = 5     decode(6, true)  = 3
        decode(7, false) = 7     decode(5, false) = 5
        decode(5, true)  = 1     decode(4, true)  = 8
        decode(1, false) = 1     decode(3, false) = 3
        decode(3, true)  = 6     decode(2, true)  = 4
        decode(2, false) = 2     decode(1, false) = 1

                    Sum = 30                 Sum = 31
               30 mod 10 = 0            31 mod 10 = 1
This number may be valid    This number is invalid

编写一个名为 checkDigits 的静态方法,传递一个七位数的信用卡号码并执行上述步骤。重用您在实验 5.5.1 中编写的解码方法。如果数字通过测试,该方法应该返回单词“valid”,否则返回“invalid”。

import java.util.Scanner;

public class JavaApplication90 
{
    public static void main(String[] args) 
    {
        Scanner scan = new Scanner(System.in);
        int num = 2315778;
        System.out.println("Credit card number: " + num + " is " + checkDigits(num));
        num = 1234567;
        System.out.println("Credit card number: " + num + " is " + checkDigits(num));
        num = 7654321;
        System.out.println("Credit card number: " + num + " is " + checkDigits(num));
        num = 1111111;
        System.out.println("Credit card number: " + num + " is " + checkDigits(num));
    }

    public static boolean checkDigits(int num)
    {
        int sum = 0;
        String reverse = new StringBuffer(num).reverse().toString();
        for (int i = 0; i < reverse.length(); i++){
            int product = 0;
            if (i % 2 == 0)
            {
                product = num * 2;
            }
            if (product < 9)
                product = (product%10)-1;
            sum = sum+ product   ;           
        }
        return (sum % 10 == 0);
    }
}

输出:

我得到所有数字的真实/有效答案。我无法找到我的错误。救命!

【问题讨论】:

  • 你能正确缩进你的代码吗?
  • 这段代码无法阅读,这很可能是您犯错的原因。请学习使用 IDEA 和自动格式化功能。切勿在此处发布未格式化的代码。
  • @DavidWallace 自动更正再次出现。也许我的意思是 IDE “IDEA”...
  • 你能正确缩进你的代码吗? --首先是将int转换为字符串
  • 你能正确缩进你的代码吗?首先是将 int 转换为字符串;然后如果数字是偶数,它将加倍,如果是两位数,我添加它。例如,如果数字是 8 并且它在偶数位置,它将加倍,即 16 和 16 是两位数,所以我添加 1+6 即 if(product

标签: java methods luhn


【解决方案1】:

至少存在三个问题。

  • i为奇数的情况下不设置product;所以在这种情况下,product 将为 0,并且总和将是错误的。
  • 您实际上并没有寻找num 的第i 个数字。您每次引用它时都只是使用num 批发,而您应该使用reverse.charAt(i) 之类的东西。
  • 您正在创建的StringBuffer 实际上是空的- 您使用的构造函数并没有按照您的想法执行。这意味着您根本没有迭代 for 循环。您可能应该检查 Javadocs 以找到更合适的 StringBuffer 构造函数来使用。

【讨论】:

  • @Mr.Polywhirl 为什么?努普尔让我们找出她的问题。我发现了她的问题。如果您认为我的回答不够充分,请投反对票。但是 cmets 不是用来输入答案的。
  • 抱歉,您原来的答案比现在短。
  • 没关系。它仍然是一个答案,而不是评论,因为它回答了这个问题。尽管它最初并不完整。长度不是答案的定义标准。 @Mr.Polywhirl
  • 还有更多的问题。
  • (但我希望让提问者自己调试并找到它们)
猜你喜欢
  • 2015-04-30
  • 2013-08-10
  • 1970-01-01
  • 2021-05-16
  • 2023-04-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-20
相关资源
最近更新 更多