Java 卢恩';s算法

Java 卢恩';s算法,java,methods,luhn,Java,Methods,Luhn,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

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);
    }
}
import java.util.Scanner;
公共类JavaApplication90
{
公共静态void main(字符串[]args)
{
扫描仪扫描=新扫描仪(System.in);
int num=2315778;
System.out.println(“信用卡号:“+num+”是“+checkDigits(num));
num=1234567;
System.out.println(“信用卡号:“+num+”是“+checkDigits(num));
num=7654321;
System.out.println(“信用卡号:“+num+”是“+checkDigits(num));
num=1111111;
System.out.println(“信用卡号:“+num+”是“+checkDigits(num));
}
公共静态布尔校验位(int num)
{
整数和=0;
String reverse=new StringBuffer(num).reverse().toString();
对于(int i=0;i
输出:


我得到了所有数字的正确/有效答案。我找不到我的错误。救命啊

至少有三个问题

  • 如果
    i
    为奇数,则不设置
    product
    ;因此,在这种情况下,
    乘积
    将为0,总和将是错误的
  • 实际上,您没有查找
    num
    i
    第个数字。每次引用它时,您只是大量使用
    num
    ,而应该使用类似
    reverse.charAt(i)
    的内容
  • 您正在创建的
    StringBuffer
    实际上是空的-您所使用的构造函数并不是您所认为的那样。这意味着您根本没有为
    循环迭代
    。您可能应该检查Javadocs,以找到更适合使用的
    StringBuffer
    构造函数

您能正确缩进代码吗?此代码无法读取,这很可能是您出错的原因。请学习使用IDEA和自动格式化功能。永远不要在这里发布未格式化的代码。@DavidWallace autocorrect再次出现。也许我指的是IDE的“想法”…你能正确缩进你的代码吗首先,它将int转换为string。您能正确缩进您的代码吗?首先,它将int转换为string;然后,若数字是偶数,它将加倍,若它是两位数,我就加上它。例如,如果数字是8,它在偶数位置,它将加倍,即16和16是两位数,所以我加1+6,这是如果(product@Mr.Polywhirl为什么?努普尔让我们找出她的问题。我发现了她的问题。如果你认为我的答案不充分,那么就投反对票。但评论不是用来回答问题的。对不起,你原来的答案比你现在的答案短。没关系。这仍然是一个答案,不是评论,因为它回答了问题。即使呃,它最初并不完整。长度不是答案的定义标准。@Mr.Polywhere还有更多的问题。(但我希望让提问者自己调试并找到问题)