Java 卢恩';s算法
a) 从校验数字开始向左移动,计算所有解码数字的总和。 b) 使用整数除以10计算和的剩余部分。如果结果不是零,则信用卡号无效。否则,卡号可能是有效的 以下是两个例子: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
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