Luhn算法有时候工作有时会失败

时间:2016-05-06 06:50:02

标签: c algorithm luhn

如果它符合算法,则输出应为true,如果不匹配,则输出应为false。知道哪里出错了吗?

我试过

1586455534096 ; output : false(fail)

49927398716 ; output : true (ok)

984697300577 ; output : false (fail)

代码

#include<stdio.h>
#include<string.h>

int main()
{
  char str[100];
  int n,num[100],prod[100],remainder,sum,total;
  scanf("%s", str);
  for(n=0;n<100;n++)
    {
      if(str[n]==0) break;
      num[n] = str[n] - '0';
      if(n%2!=0)
        {
          prod[n]=num[n]*2;
          sum=0;
          while(prod[n]>=10)
            {
              remainder=prod[n]%10;
              sum=sum+remainder;
              prod[n]=prod[n]/10;
            }
          num[n]=sum;
          }
      total = total + num[n];
      }
 if(total%10==0)
    printf("true\n");
  else
    printf("false\n");
  return 0;
}

3 个答案:

答案 0 :(得分:3)

您的代码正常运作。

#include<stdio.h>
#include<string.h>

int main()
{
  char str[100];
  int n,num[100],prod[100],remainder,sum,total=0;
  scanf("%s", str);
  for(n=0;n<100;n++)
    {
      if(str[n]==0) break;
      num[n] = str[n] - '0';
      if(n%2!=0)
        {
          prod[n]=num[n]*2;
          sum=0;
          while(prod[n]>0)
            {
              remainder=prod[n]%10;
              sum=sum+remainder;
              prod[n]=prod[n]/10;
            }
          num[n]=sum;
          }
      total = total + num[n];
      }
 if(total%10==0)
    printf("true\n");
  else
    printf("false\n");
  return 0;
}

在您的代码中有两个主要问题:

  1. 至少
  2. 的总变量没有初始值
  3. 内在的同时必须使用>0作为条件。
  4. 我对您的代码的更正

    #include<stdio.h>
    #include<stdint.h>
    #include<string.h>
    
    int main()
    {
        char format[32];
        char str[100]={0};
        uint32_t n=0;
        uint32_t num = 0;
        uint32_t total=0;
    
        snprintf(format, sizeof(format), "%%%zus", (sizeof(str)/sizeof(str[0]))-1 );
    
        scanf(format, str);
    
        while (str[n] != '\0')
        {
            num = str[n] - '0';
    
            if(n%2!=0)
            {
                num*=2;
                while(num>0)
                {
                    total += num%10;
                    num/=10;
                }
            }
            else
            {
                total += num;
            }
    
            n++;
        }
    
        if(total%10==0)
            printf("true\n");
        else
            printf("false\n");
    
        return 0;
    }
    

答案 1 :(得分:0)

乍一看total未初始化,代码中未初始化的值会导致不确定的值

答案 2 :(得分:0)

您永远不会在使用它之前初始化total,这意味着它的值是不确定并为您提供未定义的行为。可能与其他变量相同。

初始化声明中的变量,例如

int n, num[100] = { 0 }, prod[100] = { 0 }, remainder = 0, sum = 0,total = 0;