0
  • ステップ1:カード番号の右から2番目の数字から始まる1桁目の数字の値を2倍にします。
  • ステップ 2: ステップ 1 で取得した個々の数字と、元の番号の影響を受けていない各数字を追加します。
  • ステップ 3: ステップ 2 で得られた合計が 10 で割り切れる場合、そのカード番号は有効であり、それ以外の場合は無効です。

たとえば、Mod 10 アルゴリズムを使用して VISA カード 49977393716 のカード番号を検証するには:

ステップ1:

4 9 9 7 7 3 9 3 7 1 6
  x2  x2  x2  x2  x2

= 18 14 6 6 2

ステップ2:4 + (1+8) + 9 + (1+4) + 7 + (6) + 9 + (6) + 7 + (2) + 6 = 70

ステップ3:70は10で割り切れる⇒カード番号は有効

これは質問の 2 番目の部分です。したがって、カード番号のuserInputを文字列として取得しました。つまり、必要な文字 // 代替値である charAt() を実行する必要があります。

     int[] digits = new int[cardNo.length()/2];//Number of alternate values available
        char digit1;
        char digit2;
        int intDigit1;
        int intDigit2;
        int[] sumOfTwoDigits = new int[cardNo.length()/2];
        int totalSum;
        String digitsChar;

 for(int i=0; i<digits.length; i++){             
            digits[i]=(cardNo.charAt(i+1))*2; 
            digitsChar=Integer.toString(digits[i]);
            digit1= digitsChar.charAt(1);
            digit2= digitsChar.charAt(2);
            intDigit1= Character.getNumericValue(digit1);//Convert char to int to perform addition
            intDigit2= Character.getNumericValue(digit2);//Convert char to int to perform addition

            sumOfTwoDigits[i] = intDigit1+intDigit2;
            System.out.println("digits: " + intDigit1);

        }
4

3 に答える 3

1

いくつかの指針:

  • 一連の数字の右端から開始し、左に向かって作業する必要があります。チェック ディジットの場合は、クレジット カード番号の最後の桁。クレジット カードには、奇数桁のものと偶数桁のものがあります。文字列の「右」端から開始することは、正しい数字を 2 倍にしていることを確認する 1 つの方法です。
  • 一部のクレジット カードでは奇数の桁数が使用されているという事実は、各ループで 2 文字を処理できることに頼ることができないことを意味します (少なくとも、その奇数の残りの文字の特別なケースの処理がなければ)。
  • 数字を 2 倍にして結果が 10 より大きい場合は、結果から 9 を引きます (事実上 2 つの数字を足し合わせます)。
于 2012-08-18T21:55:49.730 に答える
0

私のJavaは少しさびていますが、ここに行きます:

public static boolean luhnVerify(String str) {
  int sum = 0;
  int value;
  int idx = str.length(); // Start from the end of string
  boolean alt = false;

  while(idx-- > 0) {
    // Get value. Throws error if it isn't a digit
    value = Integer.parseInt(str.substring(idx, idx + 1));
    if (alt) {
      value *= 2;
      if (value > 9) value -= 9;
    }
    sum += value;
    alt = !alt;  //Toggle alt-flag
  }
  return (sum % 10) == 0;
}

Luhn アルゴリズムは右端から開始し、1 桁おきに 2 を掛けて結果を加算します。

  1. 上記のコードInteger.parseInt(str.substring(idx,idx+1))では、文字列から各桁を取得するために使用しています。数字でない場合、エラーがスローされます。
  2. ここで - フラグをチェックし、altそれが true の場合は値に 2 を掛けます。結果が 9 より大きい場合は、9 を引きます。これは、1+[0-8] を足した場合と同じ結果になります。
  3. 値を合計に追加し、フラグを切り替えますalt
  4. 合計が 10 で割り切れる場合、結果は true です。
于 2012-08-18T22:12:28.227 に答える
-1

私はあなたが意図していると思うことをするコードを書こうとしました:

String cardNo = "49977393716";
int[] digits = new int[cardNo.length()/2]; //Number of alternate values available
int[] sumOfTwoDigits = new int[cardNo.length()/2];

for(int i=0; i<digits.length; i++){ 
        //get the numeric value of the char, instead of the int representation            
        digits[i]=Character.getNumericValue(cardNo.charAt(2*i+1))*2;

        //using Michael Burr's trick
        sumOfTwoDigits[i] = digits[i] >= 10 ? digits[i] - 9 : digits[i]; 
}

charの位置にを割り当てたために問題が発生しint[]、そのためにのint表現を使用しましたchar。このため、への呼び出しdigitsChar[2]は失敗しませんでした(これは、どの桁の2倍も2桁を超えることはできず、半分は1桁しかないためです)。これintは、桁の2倍の表現がcharすべて3桁であるためです。 。

于 2012-08-18T23:37:08.117 に答える