CS50 pset 1信用(长除以数字)

时间:2020-08-02 14:34:53

标签: c long-integer cs50 credit-card

我目前正在尽力解决这个问题。但是,我遇到了以下问题:

检查完总和后,我想验证卡号中的前2位数字。 所以我使用以下方法:

int main(void)
{
  long long ccn;
  do
  {
    ccn = get_long_long("Credit Card No.:\n");
  }
  while (ccn < 0);
  int ccn_len;
  long long count = ccn;
  long long bccn = ccn;
  for (ccn_len = 0; count != 0; ccn_len++, count /= 10);
    int sum = 0; //checksum
    for (int i = 0; i < ccn_len; ccn /= 10, i++) 
    {
      if (i % 2 == 0)
      {
        sum += ccn % 10;
      }
      else
      {
        int digit = (ccn % 10) * 2;
        sum += digit / 10 + digit % 10;
      }
    }
    if (sum % 10 != 0) 
    {
      printf("INVALID");
    }
    else
    {
      int a = bccn / 1e13;
      if ((bccn / 1e13 == 34 || bccn / 1e13 == 37) && ccn_len == 15)
      {
        printf("AMERICAN EXPRESS");
      }
      else if (bccn / 1e12 == 4 && ccn_len == 13)
      {
        printf("VISA");
      }
      else if (ccn_len == 16)
      {
        if (bccn / 1e15 == 4)
        {
          printf("VISA");
        }
        if (bccn / 1e14 > 50 || bccn / 1e14 < 56)
        {
          printf("MASTERCARD");
        }
      }
      else
      {
        printf("INVALID");
      }
    }
  }
}

假设它是有效的AE卡:378282246310005,长度为15位数字

在上面的代码中,我使用ccn / 1e13来获取前两位数字以检查它是34还是37。

但是,在满足校验和之后,输出仍然显示INVALID。

我尝试使用另一种方法, 我设置一个变量 和a = ccn / 1e13 然后在if语句中放一个:

if ((a == 34 || a == 37) || ccn_len == 15)

这次一切正常。

谁能告诉我我的代码出了什么问题?还是我写得更好?

非常感谢您的答复。

1 个答案:

答案 0 :(得分:0)

1e13是类型为double的浮点常量。在bccn / 1e13中,bccn被转换为double,然后执行浮点除法,得到诸如37.82822463100050214279690408147871494293212890625的数字。然后bccn / 1e13 == 37的判断结果为假,因为37.8282246310005050279279690408147871494293212890625不等于37。

将代码重写为仅使用整数算术(不要使用1e13之类的浮点常量)或将信用卡“数字”视为数字字符串而不是整数。