Java 信用卡验证-技术正确,但有算法错误?
这就是任务: 使用8位数字检查信用卡号码 •从最右边的数字开始,形成每个其他数字的总和。例如,如果信用卡号为43589795,则您形成的总和为5+7+8+3=23。 •将前一步骤中未包含的每个数字加倍。将结果数字的所有数字相加。例如,对于上面给出的数字,从倒数第二位开始,将数字加倍,得到18 10 8。将这些值中的所有数字相加得到1+8+1+8+1+0+8=27。 •将前面两个步骤的总和相加。如果结果的最后一位为0,则该数字有效。在我们的例子中,23+27=50,所以这个数字是有效的。 --有效/无效 我为这些方法创建了一个测试程序和一个单独的测试程序。所有内容都已成功编译,因此不应出现任何技术错误,但即使我输入了有效的卡号,程序也会返回无效的卡号,因此我假设实际的算法有问题,但我对这方面相当陌生,所以我无法弄清楚它是什么Java 信用卡验证-技术正确,但有算法错误?,java,credit-card,Java,Credit Card,这就是任务: 使用8位数字检查信用卡号码 •从最右边的数字开始,形成每个其他数字的总和。例如,如果信用卡号为43589795,则您形成的总和为5+7+8+3=23。 •将前一步骤中未包含的每个数字加倍。将结果数字的所有数字相加。例如,对于上面给出的数字,从倒数第二位开始,将数字加倍,得到18 10 8。将这些值中的所有数字相加得到1+8+1+8+1+0+8=27。 •将前面两个步骤的总和相加。如果结果的最后一位为0,则该数字有效。在我们的例子中,23+27=50,所以这个数字是有效的。 --有效
import java.util.Scanner;
public class CreditCardTester{
public static void main(String[] args){
Scanner scanner = new Scanner(System.in);
String retry = ("y");
String n = null;
while(retry.equalsIgnoreCase("y")){ // allows program to keep running even if the user enters in a capital Y
int lengthCheck = 1;
System.out.println("Please enter your 8-digit credit card number");
// check to see whether the input number is exactly 8 digits
while(lengthCheck==1){
n = scanner.next();
if(n.length()==8)
lengthCheck=0;
else
System.out.println("Please make sure the credit card number you have entered is 8 digits");
} // end inner while loop
// instantiate CardNumber and check validity
CardNumber number = new CardNumber(n);
number.check();
if (number.isValid())
System.out.println("The number you entered is a valid credit card number.");
else
System.out.println("The number you entered is not a valid credit card number. Would you like to enter in another number? (y/n)");
retry = scanner.next();
} // end outer while loop
}
}
还有单独的班级
public class CardNumber {
private String number;
private boolean valid;
public CardNumber(String n){
number = n;
valid = true;
}
private void check1(){
int a = Integer.parseInt(number.substring(7));
int b = Integer.parseInt(number.substring(5,6));
int c = Integer.parseInt(number.substring(3,4));
int d = Integer.parseInt(number.substring(1,2));
int oddsum = a + b + c + d;
int e = (Integer.parseInt(number.substring(6,7))) * 2;
int f = (Integer.parseInt(number.substring(4,5))) * 2;
int g = (Integer.parseInt(number.substring(2,3))) * 2;
int h = (Integer.parseInt(number.substring(0,1))) * 2;
String ee = String.valueOf(e);
String ff = String.valueOf(f);
String gg = String.valueOf(g);
String hh = String.valueOf(h);
int evensum = (Integer.parseInt(ee.substring(0))) + (Integer.parseInt(ff.substring(0))) + (Integer.parseInt(gg.substring(0))) + (Integer.parseInt(hh.substring(0)));
int totalsum = evensum + oddsum;
if (!(totalsum%10 == 0))
valid=false;
}
public void check(){
check1();
}
public boolean isValid(){
return valid;
}
}
我相信还有更好的方法可以做到这一点,所以所有的建议都非常感谢 信用卡号验证称为Luhn算法。下面是一个java实现 对于您的代码,我认为:
int evensum = (Integer.parseInt(ee.substring(0))) + (Integer.parseInt(ff.substring(0))) + (Integer.parseInt(gg.substring(0))) + (Integer.parseInt(hh.substring(0)));
您的意思是将两个数字相加:
int evensum = Integer.parseInt(ee.substring(0,1)) + Integer.parseInt(ee.substring(1)) ...
信用卡号验证称为Luhn算法。下面是一个java实现 对于您的代码,我认为:
int evensum = (Integer.parseInt(ee.substring(0))) + (Integer.parseInt(ff.substring(0))) + (Integer.parseInt(gg.substring(0))) + (Integer.parseInt(hh.substring(0)));
您的意思是将两个数字相加:
int evensum = Integer.parseInt(ee.substring(0,1)) + Integer.parseInt(ee.substring(1)) ...
试试这个
public class CardNumber {
String number;
boolean valid;
public CardNumber(String n){
number = n;
}
public void check(){
// The odd sum
// For the eight digits, 1, 3, 5, 7 are odd
int a = Integer.parseInt("" + number.charAt(1));
int b = Integer.parseInt("" + number.charAt(3));
int c = Integer.parseInt("" + number.charAt(5));
int d = Integer.parseInt("" + number.charAt(7));
int oddsum = a+b+c+d;
// The even sum
int e = (Integer.parseInt(number.substring(6,7))) * 2;
int f = (Integer.parseInt(number.substring(4,5))) * 2;
int g = (Integer.parseInt(number.substring(2,3))) * 2;
int h = (Integer.parseInt(number.substring(0,1))) * 2;
// As suggested by RUP to make it more simple
int evensum = e + f + g + h;
// Total sum
int totalsum = oddsum + evensum;
valid = (totalsum%10==0)?true:false;
}
public boolean isValid(){
return valid;
}
}
试试这个
public class CardNumber {
String number;
boolean valid;
public CardNumber(String n){
number = n;
}
public void check(){
// The odd sum
// For the eight digits, 1, 3, 5, 7 are odd
int a = Integer.parseInt("" + number.charAt(1));
int b = Integer.parseInt("" + number.charAt(3));
int c = Integer.parseInt("" + number.charAt(5));
int d = Integer.parseInt("" + number.charAt(7));
int oddsum = a+b+c+d;
// The even sum
int e = (Integer.parseInt(number.substring(6,7))) * 2;
int f = (Integer.parseInt(number.substring(4,5))) * 2;
int g = (Integer.parseInt(number.substring(2,3))) * 2;
int h = (Integer.parseInt(number.substring(0,1))) * 2;
// As suggested by RUP to make it more simple
int evensum = e + f + g + h;
// Total sum
int totalsum = oddsum + evensum;
valid = (totalsum%10==0)?true:false;
}
public boolean isValid(){
return valid;
}
}
你可以在这里找到信用卡验证器的定制植入,它同时进行信用卡号码验证和信用卡类型检测
您可以在这里找到定制的信用卡验证程序,它既可以进行信用卡号码验证,也可以进行信用卡类型检测
尝试使用调试器单步执行,以查看发生了什么,以及它是否符合您的预期。用问题中的例子。还有比通过字符串往返更好的方法将数字分割成数字——使用
/10
和%10
。当您编写.substring(0)
时,您打算做什么?运行prg,也没有看到输出中的任何错误。为什么要将e转换为字符串ee,然后将其转换回整数<代码>int evensum=e+f+g+h代码>在我看来没问题。请尝试使用调试器单步执行,以查看发生了什么,以及它是否符合您的预期。用问题中的例子。还有比通过字符串往返更好的方法将数字分割成数字——使用/10
和%10
。当您编写.substring(0)
时,您打算做什么?运行prg,也没有看到输出中的任何错误。为什么要将e转换为字符串ee,然后将其转换回整数<代码>int evensum=e+f+g+h代码>在我看来没问题。你有多余的不必要的括号。@SteveKuo我的回答更多的是暗示他的算法可能有什么问题。在开始回答时,我提供了一个更好的实现。“谢谢你,虽然你还有多余的不必要的括号。”史蒂夫库我的回答更多地暗示了他的算法可能有什么问题。在开始回答时,我提供了一个更好的实现。谢谢你为什么把e,f,g,h转换成字符串然后再转换回来?谢谢。我复制了他的源代码并对其进行了修改。为什么要将e、f、g、h转换为字符串,然后再转换回来呢?谢谢。我复制了他的资料并修改了它。