gpt4 book ai didi

Java:如何使用 Luhn 检查和使用方法检查信用卡有效性

转载 作者:行者123 更新时间:2023-12-02 09:21:26 25 4
gpt4 key购买 nike

我一直在试图找出验证信用卡的 Luhns 方法,但我似乎无法弄清楚。我需要使用方法而不能使用数组,所以我完全被难住了。

这是 Luhns 检查:

信用卡号必须包含 13 到 16 位数字。它必须从以下内容开始:■ 4 个用于 Visa 卡■ 万事达卡5张■ 美国运通卡为 37■ 6 个探索卡

  1. 从右到左每隔一个数字加倍。如果数字加倍得到两位数,则将这两位数相加得到一位数。
  2. 现在添加步骤 a 中的所有个位数。
  3. 添加卡号中从右到左奇数位的所有数字。
  4. 对步骤 b 和步骤 c 的结果求和。
  5. 如果步骤d的结果能被10整除,则卡号有效;否则无效。例如,号码 4388576018402626 无效,但号码 4388576018410707 有效。

我的问题是我仍在学习方法(完全是初学者。去年我尝试学习编码一次并放弃了,但这次我已经成功做到了这一点)并且我不知道如何使用这些方法执行 Luhn 检查中的步骤 4 和 5。

有人可以帮我吗?谢谢!!

public static boolean isValid(String x) {
return false; // Stub method
}

public static void AddResults() {

}

public static void OddDigits(String s) {
int sum = 0;
for (int index = 0; index < s.length(); index ++) {
if (index % 2 != 0) {
sum = sum + Character.getNumericValue(s.charAt(index));
}
}
return;
}

public static int DoubleToSingle(int x) { // Adds up the digits in a two-digit number.
if (x < 10) {
return x;
}
else {
int firstDigit = x % 10;
int secondDigit = (int)(x / 10);
return firstDigit + secondDigit;
}
}

public static void Doubling(String s) {
int sum = 0;
for (int index = s.length() - 1; index > 0; index-= 2) {
int parse = Character.getNumericValue(s.charAt(index));
if (parse > 9) {
sum = sum + DoubleToSingle(parse);
}
else {
sum = sum + parse;
}
}

return;
}

public static boolean CheckLength(String s) {
if (s.length() < 13 || s.length() > 16) { // If the cc number is smaller than 13 digits or larger than 16 digits, it's invalid
return false;
}
else {
return true;
}
}

public static String ReadString(Scanner s) { // Creating a string method. (Using it to practice creating methods)
String x = s.nextLine();
return x;
}

public static void main(String[] args) {
Scanner input = new Scanner(System.in);
System.out.println("Please input a valid Credit Card number: ");
String CC = ReadString(input);

if (isValid(CC) == true) {
System.out.println(CC + " is valid.");
} else {
System.out.println(CC + " is invalid.");
}
input.close();
}

最佳答案

关于您的代码的评论:

  • Java 命名约定是方法名称以小写字母开头,例如 isValid 方法。

  • doubleToSingle 方法中, x 是一个 int ,而 10 是一个 int 文字,因此 x / 10 将是一个 int ,结果被截断,这意味着不需要进行此转换: (int)(x / 10)

  • 由于 doubleToSingle 方法可以处理单位数字,因此调用者(doubling 方法)不需要也处理它,因此消除 if (parse > 9) 测试。

  • 从右边开始计算数字的工作方式如下:

     5th digit       Odd places:
    ↓ 3rd digit Don't double these digits, just sum them
    ↓ ↓ 1st digit
    ↓ ↓ ↓
    999999
    ↑ ↑ ↑
    ↑ ↑ 2nd digit Even places, aka "every second digit from right":
    ↑ 4th digit Double these digits, combine digits when
    6th digit two-digit number, then sum them

    doubling 方法从 last 索引开始,而不是应该从倒数第二个索引开始,并且它会跳过 first 索引,而它不应该。循环应该是:

    for (int index = s.length() - 2; index >= 0; index -= 2)
  • 在调用 doubling 方法之前,parse * 2 方法实际上需要将数字 ( doubleToSingle ) 加倍。

  • oddDigits 方法从左侧开始计算奇数/偶数,而它应该从右侧开始计数。

    删除 if (index % 2 != 0) 测试,并使用与 doubling 方法中使用的类似循环:

    for (int index = s.length() - 1; index >= 0; index -= 2)
  • doublingoddDigits 方法应该 return sum ,否则有什么意义?

如果您认为 doublingoddDigits 方法缺乏返回值是导致您陷入困境的原因,那么我将让您从这里开始处理其余代码。

<小时/>

虽然下面的代码超出了您当前的技能水平,但我想展示它,以便您有一些期待,能够理解并最终编写类似的代码。

public static boolean isValid(String cc) {
if (! cc.matches("(?=[456]|37)[0-9]{13,16}"))
return false;
int sum = 0;
for (int i = cc.length() - 1, pos = 1; i >= 0; i--, pos++) {
int digit = cc.charAt(i) - '0';
sum += (pos % 2 == 1/*odd*/ ? digit : digit < 5 ? digit * 2 : digit * 2 - 9);
}
return (sum % 10 == 0);
}

它会测试问题中列出的所有条件,甚至是您尚未开始的“必须开始”部分。按照您的技能水平,您可能应该使用 s.startsWith("xx") 而不是此处使用的 matches(...) 正则表达式。

关于Java:如何使用 Luhn 检查和使用方法检查信用卡有效性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58668404/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com