2013-12-22 14 views
5

以下のプログラミング割り当てに関する質問があります。luhnアルゴリズムを使用してクレジットカード番号を確認してください

クレジットカード番号は特定のパターンに従います。クレジットカードの有効数字は13〜16桁でなければなりません。それはで開始する必要があります:American Expressカード1954

37•マスターカードのビザカードの

•4

•5

を、IBMのハンスのLuhnは信用を検証するためのアルゴリズムを提案しましたカード番号。このアルゴリズムは、カード番号が正しく入力されたかどうか、またはクレジットカードがスキャナによって正しくスキャンされたかどうかを判断する場合に便利です。ほとんどのクレジットカード番号は、LuhnチェックまたはModulus 10チェックとして一般に知られているこの有効性チェックに続いて生成されます。これは次のように記述できます。例として、カード番号4388576018402625を考えます。

  1. 右から左に2桁ごとに2桁ずつ2桁です。数字の倍数が2桁の数字になる場合は、2桁の数字を加算して1桁の数字を取得します。

2×2 = 4

2×2 = 4

4×2 = 8

1×2 = 2

6×2 = 12(1+ 2 = 3)

5×2 = 10(1 + 0 = 1)

8×2 = 16(1 + 6 = 7)

4×2 = 8

  1. ステップ1 4 + 4 + 2 +8 +3 + 1 + 7 + 8 = 37

  2. からすべての1桁の数を追加
  3. は、カード番号に右から左に奇数の場所にあるすべての数字を追加

5 + 6 + 0 + 8 + 0 + 7 + 8 + 3 = 37

  1. 合計ステップ2及びステップ3 37 + 37 = 74

  2. から結果ステップの結果が10で割り切れる場合は、カード番号が有効です。それ以外の場合は無効です。たとえば、数字4388576018402625は無効ですが、数字4388576018410707は有効なVisaカードです。番号6011000593748745は無効ですが、番号6011000593748746は有効なDiscoverカードです。

次のコードに示すように、私はそれを解決しようとした:

import java.util.Scanner; 

public class CreditCardValidation { 

    public static boolean isValid(long number) { 

     int total = sumOfDoubleEvenPlace(number) + sumOfOddPlace(number); 


     if ((total % 10 == 0) && (prefixMatched(number, 1) == true) && (getSize(number)>=13) && (getSize(number)<=16)) { 
      return true; 
     } else { 
      return false; 
     } 
    } 

    public static int getDigit(int number) { 

     if (number <= 9) { 
      return number; 
     } else { 
      int firstDigit = number % 10; 
      int secondDigit = (int) (number/10); 

      return firstDigit + secondDigit; 
     } 
    } 
    public static int sumOfOddPlace(long number) { 
     int result = 0; 

     while (number > 0) { 
      result += (int) (number % 10); 
      number = number/100; 
     } 

     return result; 
    } 

    public static int sumOfDoubleEvenPlace(long number) { 

     int result = 0; 
     long temp = 0; 

     while (number > 0) { 
      temp = number % 100; 
      result += getDigit((int) (temp/10) * 2); 
      number = number/100; 
     } 

     return result; 
    } 

    public static boolean prefixMatched(long number, int d) { 

     if ((getPrefix(number, d) == 4) 
       || (getPrefix(number, d) == 5) 
       || (getPrefix(number, d) == 3)) { 

      if (getPrefix(number, d) == 3) { 
       System.out.println("\nVisa Card "); 
      } else if (getPrefix(number, d) == 5) { 
       System.out.println("\nMaster Card "); 
      } else if (getPrefix(number, d) == 3) { 
       System.out.println("\nAmerican Express Card "); 
      } 

      return true; 

     } else { 

      return false; 

     } 
    } 

    public static int getSize(long d) { 

     int count = 0; 

     while (d > 0) { 
      d = d/10; 

      count++; 
     } 

     return count; 

    } 

    public static long getPrefix(long number, int k) { 

     if (getSize(number) < k) { 
      return number; 
     } else { 

      int size = (int) getSize(number); 

      for (int i = 0; i < (size - k); i++) { 
       number = number/10; 
      } 

      return number; 

     } 

    } 

    public static void main(String[] args) { 

     Scanner sc = new Scanner(System.in); 

     System.out.print("Enter a credit card number as a long integer: "); 

     long input = sc.nextLong(); 


     if (isValid(input) == true) { 
      System.out.println("\n" + input + " is Valid. "); 
     } else { 
      System.out.println("\n" + input + " is Invalid. "); 
     } 

    } 
} 

を私の質問は、私が代わりに長い番号を使用してのクレジットカード番号を格納する配列を使用する方法です。

+2

あなたは、私が答えを与えている 'STRING' ... –

+0

を使用することができます今日の明らかに同じ質問の2番目の投稿に - [リンク](http://stackoverflow.com/questions/20740444/check-credit-card-validity-using-luhn-algorithm)を参照してください。 –

答えて

1

使用しているとして使用%10

  1. List<Integer>にあなたのintを分割し、Stringに変換して、数値に
を取る List
  • にそれを格納するための2つの方法があります。

    ここにいくつかの簡単な例があります

    public static void main(String[] args) throws Exception { 
        final int num = 12345; 
        final List<Integer> nums1 = splitInt(num); 
        final List<Integer> nums2 = splitString(num); 
        System.out.println(nums1); 
        System.out.println(nums2); 
    } 
    
    private static List<Integer> splitInt(int num) { 
        final List<Integer> ints = new ArrayList<>(); 
        while (num > 0) { 
         ints.add(0, num % 10); 
         num /= 10; 
        } 
        return ints; 
    } 
    
    private static List<Integer> splitString(int num) { 
        final List<Integer> ints = new ArrayList<>(); 
        for (final char c : Integer.toString(num).toCharArray()) { 
         ints.add(Character.getNumericValue(c)); 
        } 
        return ints; 
    } 
    
  • 1

    これは、あなたがそれはあなたの入力番号の長さを持つすべての16を交換する任意の数の上で使用したい場合は、私は唯一の16桁のクレジットカード番号

    if(ccnum.length()==16){ 
        char[] c = ccnum.toCharArray(); 
        int[] cint = new int[16]; 
        for(int i=0;i<16;i++){ 
         if(i%2==1){ 
          cint[i] = Integer.parseInt(String.valueOf(c[i]))*2; 
          if(cint[i] >9) 
           cint[i]=1+cint[i]%10; 
         } 
         else 
          cint[i] = Integer.parseInt(String.valueOf(c[i])); 
        } 
        int sum=0; 
        for(int i=0;i<16;i++){ 
         sum+=cint[i]; 
        } 
        if(sum%10==0) 
         result.setText("Card is Valid"); 
        else 
         result.setText("Card is Invalid"); 
    }else 
        result.setText("Card is Invalid"); 
    

    に使用Luhnアルゴリズムの実装です。

    それは問題で与えられたビザ番号のために動作します。(私はそれをテスト)

    +0

    ダイナーズカードでは機能しません – jonney

    1

    ここでのLuhn式の私の実装です。

    /** 
    * Runs the Luhn Equation on a user inputed CCN, which in turn 
    * determines if it is a valid card number. 
    * @param c A user inputed CCN. 
    * @param cn The check number for the card. 
    * @return If the card is valid based on the Luhn Equation. 
    */ 
    public boolean luhn (String c, char cn) 
    { 
        String card = c; 
        String checkString = "" + cn; 
        int check = Integer.valueOf(checkString); 
    
        //Drop the last digit. 
        card = card.substring(0, (card.length() - 1)); 
    
        //Reverse the digits. 
        String cardrev = new StringBuilder(card).reverse().toString(); 
    
        //Store it in an int array. 
        char[] cardArray = cardrev.toCharArray(); 
        int[] cardWorking = new int[cardArray.length]; 
        int addedNumbers = 0; 
    
        for (int i = 0; i < cardArray.length; i++) 
        { 
         cardWorking[i] = Character.getNumericValue(cardArray[i]); 
        } 
    
        //Double odd positioned digits (which are really even in our case, since index starts at 0). 
    
        for (int j = 0; j < cardWorking.length; j++) 
        { 
         if ((j % 2) == 0) 
         { 
          cardWorking[j] = cardWorking[j] * 2; 
         } 
        } 
    
        //Subtract 9 from digits larger than 9. 
    
        for (int k = 0; k < cardWorking.length; k++) 
        { 
         if (cardWorking[k] > 9) 
         { 
          cardWorking[k] = cardWorking[k] - 9; 
         } 
        } 
    
        //Add all the numbers together. 
        for (int l = 0; l < cardWorking.length; l++) 
        { 
         addedNumbers += cardWorking[l]; 
        } 
    
        //Finally, check if the number we got from adding all the other numbers 
        //when divided by ten has a remainder equal to the check number. 
        if (addedNumbers % 10 == check) 
        { 
         return true; 
        } 
        else 
        {   
         return false; 
        } 
    } 
    

    は私がcardでスキャナと店から入手cとしてカードを渡し、そしてcnのために私はcheckNumber = card.charAt((card.length() - 1));に渡します。

    1

    これは文字列への型変換といくつかのJava 8 もので解決できます。数字を忘れず、数字を表す文字は同じではありません。 ! '1' = 1

    public static int[] longToIntArray(long cardNumber){ 
    
    return Long.toString(cardNumber).chars() 
        .map(x -> x - '0') //converts char to int 
        .toArray(); //converts to int array 
    } 
    

    あなたは今Luhnアルゴリズムを実行するには、このメソッドを使用することができます。

    public static int luhnCardValidator(int cardNumbers[]) { 
           int sum = 0, nxtDigit; 
           for (int i = 0; i<cardNumbers.length; i++) { 
            if (i % 2 == 0) 
             nxtDigit = (nxtDigit > 4) ? (nxtDigit * 2 - 10) + 1 : nxtDigit * 2; 
            sum += nxtDigit; 
           } 
           return (sum % 10); 
          } 
    
    0
    public class Creditcard { 
    
        public static void main(String args[]){ 
         Scanner sc=new Scanner(System.in); 
         String cardno = sc.nextLine(); 
    
         if(checkType(cardno).equals("U")) //checking for unknown type 
          System.out.println("UNKNOWN"); 
         else 
          checkValid(cardno); //validation 
    } 
    
    private static String checkType(String S) 
    { 
        int AM=Integer.parseInt(S.substring(0,2)); 
        int D=Integer.parseInt(S.substring(0,4)),d=0; 
        for(int i=S.length()-1;i>=0;i--) 
        { 
         if(S.charAt(i)==' ') 
          continue; 
         else 
          d++; 
        } 
        if((AM==34 || AM==37) && d==15) 
         System.out.println("AMEX"); 
        else if(D==6011 && d==16) 
         System.out.println("Discover"); 
        else if(AM>=51 && AM<=55 && d==16) 
         System.out.println("MasterCard"); 
        else if(((S.charAt(0)-'0')==4)&&(d==13 || d==16)) 
         System.out.println("Visa"); 
        else 
         return "U"; 
        return ""; 
    } 
    
    private static void checkValid(String S) // S--> cardno 
    { 
        int i,d=0,sum=0,card[]=new int[S.length()]; 
    
        for(i=S.length()-1;i>=0;i--) 
        { 
         if(S.charAt(i)==' ') 
          continue; 
         else 
          card[d++]=S.charAt(i)-'0'; 
        } 
    
        for(i=0;i<d;i++) 
        { 
         if(i%2!=0) 
         { 
          card[i]=card[i]*2; 
          if(card[i]>9) 
           sum+=digSum(card[i]); 
          else 
           sum+=card[i]; 
         } 
         else 
          sum+=card[i]; 
        } 
        if(sum%10==0) 
         System.out.println("Valid"); 
        else  
         System.out.println("Invalid"); 
    
    } 
    
    public static int digSum(int n) 
    { 
        int sum=0; 
        while(n>0) 
        { 
         sum+=n%10; 
         n/=10; 
        } 
        return sum; 
    } 
    } 
    
    関連する問題