给定一个长号,其中包含信用卡号的位数;任务是通过程序查找信用卡号是否有效。
为了检查信用卡是否有效,以下是我们必须确认的声明结果。
信用卡号必须为13至16位数字,并且必须以以下数字开头。
所有签证卡从4开始
所有主卡从5开始
37是美国运通卡的起点
所有发现卡均从6开始
检查信用卡是否有效的步骤-
步骤1-从右到左,我们必须将每个数字加倍,如果将数字加倍的结果是一个数字,则保持原样,否则将两个数字加起来得到一个数字。(例如22 = 2 + 2 = 4)
步骤2-从卡号的右到左开始,将所有数字添加到奇数位。
步骤3-添加从步骤1获得的所有单位数字。
步骤4-将步骤2和步骤3的结果相加。
步骤5-如果结果可被10整除,则卡号有效,否则该卡号无效。
Input: n = 4440967484181607 Output: 4440967484181607 is valid Input: n = 379354508162306 Output: 379354508162306 is valid
我们用来解决问题的方法-
我们将对数字4440967484181607使用Luhn支票或mod 10支票。
Start Step1-> In function void main(String[] args) Declare and initialize cnumber = 4440967484181607L Call function validitychk Print the result Step 2-> In function boolean validitychk(long cnumber) Return thesize(cnumber) >= 13 && thesize(cnumber) <= 16) && (prefixmatch(cnumber, 4) || prefixmatch(cnumber, 5) || prefixmatch(cnumber, 37) || prefixmatch(cnumber, 6)) && ((sumdoubleeven(cnumber) + sumodd(cnumber)) % 10 == 0 Step 3-> In function int sumdoubleeven(long cnumber) Declare and set sum = 0 Declare and set num = cnumber + "" Loop For i = thesize(cnumber) – 2 and i >= 0 and i -= 2 Set sum = sum + getDigit(Integer.parseInt(num.charAt(i) + "") * 2) Return sum Step 4-> In function int getDigit(int cnumber) if cnumber < 9 then, Return cnumber Return cnumber / 10 + cnumber % 10 Step 5-> In function int sumodd(long cnumber) Set sum = 0 Set num = cnumber + "" Loop For i = thesize(cnumber) – 1 and i >= 0 and i -= 2 Set sum = sum + Integer.parseInt(num.charAt(i) + "") Return sum Step 6-> In function boolean prefixmatch(long cnumber, int d) Return getprefx(cnumber, thesize(d)) == d Step 7-> In function int thesize(long d) Set num = d + "" Return num.length() Step8-> In function long getprefx(long cnumber, int k) If thesize(cnumber) > k then, Set num = cnumber + "" Return Long.parseLong(num.substring(0, k)) Return cnumber Stop
import java.util.Scanner;
public class Main {
   //主要方法
   public static void main(String[] args) {
      long cnumber = 4440967484181607L;
      System.out.println(cnumber + " is " + (validitychk(cnumber) ? "valid" : "invalid"));
   }
   //如果卡号有效,则返回true-
   public static boolean validitychk(long cnumber) {
      return (thesize(cnumber) >= 13 && thesize(cnumber) <= 16) && (prefixmatch(cnumber, 4)
         || prefixmatch(cnumber, 5) || prefixmatch(cnumber, 37) || prefixmatch(cnumber, 6))
         && ((sumdoubleeven(cnumber) + sumodd(cnumber)) % 10 == 0);
   }
   //从步骤2中获取结果
   public static int sumdoubleeven(long cnumber) {
      int sum = 0;
      String num = cnumber + "";
      for (int i = thesize(cnumber) - 2; i >= 0; i -= 2)
         sum += getDigit(Integer.parseInt(num.charAt(i) + "") * 2);
      return sum;
   }
   //如果它是一位数字,则返回此cnumber,否则,
   //返回两个数字的总和
   public static int getDigit(int cnumber) {
      if (cnumber < 9)
         return cnumber;
      return cnumber / 10 + cnumber % 10;
   }
   //返回cnumber中的奇数位和
   public static int sumodd(long cnumber) {
      int sum = 0;
      String num = cnumber + "";
      for (int i = thesize(cnumber) - 1; i >= 0; i -= 2)
         sum += Integer.parseInt(num.charAt(i) + "");
      return sum;
   }
   //如果数字d是cnumber前缀,则返回true
   public static boolean prefixmatch(long cnumber, int d) {
      return getprefx(cnumber, thesize(d)) == d;
   }
   //返回d中的位数
   public static int thesize(long d) {
      String num = d + "";
      return num.length();
   }
   //返回前k个数字
   //数。如果数字中的位数
   //小于k,返回数字。
   public static long getprefx(long cnumber, int k) {
      if (thesize(cnumber) > k) {
         String num = cnumber + "";
         return Long.parseLong(num.substring(0, k));
      }
      return cnumber;
   }
}输出结果
4440967484181607 is valid