【问题标题】:Credit card validation check in C programmingC编程中的信用卡验证检查
【发布时间】:2020-09-19 10:30:55
【问题描述】:

这是 CS50 使用 luhn 算法查找信用卡号验证的问题。我写了这段代码,但是每当我输入任何信用卡号码时,输出都是无效的。谁能帮我看看我的错误是什么,我该如何继续使用这段代码。

这是 luhn 的算法公式—— 大多数卡片使用 IBM 的 Hans Peter Luhn 发明的算法。根据 Luhn 的算法,您可以确定信用卡号是否(在语法上)有效,如下所示:

从数字的倒数第二个数字开始,每隔一个数字乘以 2,然后将这些产品的数字相加。 将总和与未乘以 2 的数字的总和相加。 如果总数的最后一位是 0(或者更正式地说,如果总数模 10 等于 0),则该数字有效!

//Project Using Luhn's Algorithm - Credit Card validation

#include<cs50.h>
#include<stdio.h>
#include<string.h>
int main()
{
   long long ccnum = 0;



    int digitcounter = 0 ;
    char result[11] ;
    int sum = 0 ;
    int  divisor = 10 ;

    do
    {
      ccnum = get_long("Enter your credit card number: ") ;
    }
    while (ccnum <= 0) ;

//--------------------CHECKSUM--------------------------------

    //Case-01(Multiply every other digit by 2):

    long long tempccnum = ccnum ;
    while (tempccnum > 0)
    {
        int lastdigit = tempccnum % 10 ;
        sum = sum + lastdigit ;
        tempccnum = tempccnum / 100 ;
    }

    // Case-02(Multiplication every other digit by 2):

    tempccnum = ccnum / 10 ;
    while(tempccnum > 0)
    {
        int secondlastdigit = (tempccnum % 10) ;

        int tempmultiply = secondlastdigit*2 ;

        sum = sum + (tempmultiply % 10) + (tempmultiply / 10)  ;

        tempccnum = tempccnum / 100 ;
    }
//----------first two digit extraction------------

   long long initdigit = 0, tempinitdigit = 0 ;

   while(ccnum)
   {
     initdigit = tempinitdigit  ; // initdigit will hold the first two digits.
     tempinitdigit = ccnum  ;
     ccnum = ccnum/10 ;
   }




//-------------Digit counter----------
    while(ccnum != 0)
    {
          // iterate until ccnum becomes 0
         // remove last digit from ccnum in each iteration
        // increase digitcounter by 1 in each iteration

        ccnum = ccnum / 10 ;
        digitcounter++ ;
    }
  //------------------Final part - Condition checking------------------------

    if(sum % 10 == 0)
    {
        if (digitcounter == 15 && (initdigit == 34 || initdigit == 37))
        {
            strcpy(result, "AMEX\n") ;
        }

        else if (digitcounter == 16 && (initdigit >= 51 && initdigit <=55))
        {
             strcpy(result,"MASTERCARD\n") ;
        }

        else if ((digitcounter == 13 || digitcounter == 16) && tempinitdigit == 4)
        {
             strcpy(result,"VISA\n") ;
        }

        else
        {
             strcpy(result,"INVALID\n") ;
        }

    }

    else
    {
        strcpy(result,"INVALID\n") ;
    }
    printf("%s\n", result) ;
}

【问题讨论】:

  • 数完后ccnum的值是多少?

标签: c cs50 luhn


【解决方案1】:

您提取前 2 位数字的代码错误:

  while(ccnum)
   {
     initdigit = tempinitdigit  ; // initdigit will hold the first two digits.
     tempinitdigit = ccnum  ;
     ccnum = ccnum/10 ;
   }

这只会将 initdigit 设置为第二个数字。但是 tempinitdigit 确实保留了第一个数字,因此您应该在 while 循环之后添加它:

   initdigit = initdigit + tempinitdigit * 10;

解决此类问题的最佳方法是使用调试器单步调试代码。

【讨论】:

  • 仍然给出输出为 INVALID ;我尝试使用有效的信用卡号。
  • 是否尝试在查看变量的同时使用调试器单步执行代码?
  • 作为 C 语言的新手,我一遍又一遍地尝试,但无法得到确切的错误。请您检查信用卡号为 4003600000000014 的代码。结果应该是签证。提前谢谢你。
  • 在第一个 while(ccnum != 0) 循环计数数字后,ccnum 为 0。所以你实际上破坏了你想要调查的数据,所以下一个 while(ccnum) 已经没有做任何事情。先解决这个问题。然后修复我之前提到的关于额外行initdigit = initdigit + tempinitdigit * 10; 的内容。最后我觉得else if ((digitcounter == 13 || digitcounter == 16) &amp;&amp; tempinitdigit == 4)这行不太对,你的意思可能是else if ((digitcounter == 13 || digitcounter == 16) &amp;&amp; (initdigit &gt;= 40 &amp;&amp; initdigit &lt; 50)
  • 再说一次,尤其是如果您是 C 新手,您应该真正学会调试。 Code::Blocks 使用 C 很容易上手,而且调试也很容易。
【解决方案2】:

在第一个循环中,您声明:

    while(ccnum != 0)
    {
          // iterate until ccnum becomes 0
         // remove last digit from ccnum in each iteration
        // increase digitcounter by 1 in each iteration

        ccnum = ccnum / 10 ;
        digitcounter++ ;
    }

(你说,字面意思:迭代直到 ccnum 变为 0) 如果你删除ccnum 的所有数字并得到0,你将如何处理所有这些数字?您在代码中的第二个和下一个循环接收0 作为ccnum 的值(您一直在射击它直到它死了,记住:))

【讨论】:

    【解决方案3】:

    您在提取前两位数字时修改了 ccnum 值。而是像这样使用

    //----------first two digit extraction------------
       long long initdigit = 0, tempinitdigit = 0 ;
       tempccnum = ccnum;
       while(tempccnum)
       {
         initdigit = tempinitdigit;
         tempinitdigit = tempccnum;
         tempccnum = tempccnum/10;
       }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-14
      • 1970-01-01
      • 2011-01-24
      • 2012-08-14
      • 2017-04-02
      • 2016-11-15
      相关资源
      最近更新 更多