1
#include <stdio.h>


int main(int argc, string argv[])
{
   Get input from the user;
   Store it in a long long int;

   // iterate through the number
   for each odd number in the input multiply by 2
   if the number is bigger than 9 then
   do module of it and add it to the first number;
   store it into metasum;

   for each even number in the input
   add it to the others;
   store the result into metasum2;

   // is it a valid card?
   if (metasum + metasum2)%10 == 0
   {
   card is valid;
   // check which kind of cc is
   if the input begins with a 3 then it's an AMEX;
   else if the input begins with 4 it is a VISA;
   else if the input begins with 5 it is a MASTERCARD;
   }
   else
   {
   card is not valid;
   }

}

これは実際には一種の擬似コードです。CS50xに参加していますが、擬似コードの実装が十分かどうかを知りたいです。

ただし、別の問題があります。CIでコードを実装しようとすると、long long intを反復処理する方法がわからないため、Luhnのアルゴリズムを実装できません。

文字列を使用せずに、各文字をintに変換せずにこれを行うにはどうすればよいですか?

御返答いただき有難うございます

4

2 に答える 2

2

非配列を「反復」するには、除算とモジュラスを使用して桁を進めて抽出し、位置を個別に追跡する必要があります(可能なすべての桁をカウントするため)。次に例を示します。

long long number = 9999999999;
for (int digitPos = 0; digitPos < 16; digitPos++) {
  int thisDigit = number % 10;
  number = number / 10; 
}

あなたのコースへの適用性に関しては、私はそれを保証することはできません:)

于 2012-12-05T16:56:22.230 に答える
1

モジュロ除算と積分除算を使用します。

数字の右から1桁目(最下位桁)はnumber % 10
2番目は(number/10) % 10です。3番目はです(number/100) % 10。簡単なパターン-関数として書くことができます。(ここではフロートを混ぜないでください。)

数値の桁を反復処理する場合は、数値の桁数を確認することをお勧めします(基数10の対数を参照)。最も簡単な方法は、その数値を0になるまで10で繰り返し除算することです。


とにかく、クレジットカード番号はかなり長いことを忘れないでください!符号なし64ビットの数値には有効数字19桁(最大は2 ** 64-1)を含めることができるため、クレジットカードには十分ですが、たとえば銀行口座では機能しません。文字列(何らかの形式)を使用するアプローチがより一般的になります。

于 2012-12-05T16:59:14.923 に答える