程序冻结 - Luhn 算法

Posted

技术标签:

【中文标题】程序冻结 - Luhn 算法【英文标题】:Program Freezing - Luhn's Algorithm 【发布时间】:2014-03-04 08:34:23 【问题描述】:

我希望有人可以帮助我解决这个问题。我是一个完整而彻底的 C 新手。

这是针对 C 类的学校作业(只是普通的旧 C,而不是 C# 或 C++),教授坚持认为我们唯一被允许使用的编译器是 Borland 5.5。

一般任务是运行一个算法来检查信用卡号码的有效性。我已经成功地让程序获取用户输入的 CC 号码,然后将该号码分成一个数组。它主要打印出我想要的东西。

但是,当我输入最后一个函数(我这样评论的那个)然后编译时,程序刚刚开始挂起。我不知道是什么原因造成的。

#include <stdio.h>
#include <math.h>
#include <stdlib.h>

  //global variables declared. 
  //in an earlier version, I was going to use multiple functions, but I couldn't make them work
  float array[16]; 
  double num, ten; 
  int i, a, b, x, y, check; 

int main()



  ten = 10; 

  //pick up user-input number
  printf("Enter your credit card number\n>");
  scanf("%lf", &num); 

  //generate the array
  for (i = 15; i >= 0; i--)
    
      array[i] = fmod(num, ten); 
      num /= 10;
      printf("Array is %1.1lf\n", array[i]);
    


    //double every other number. If the number is greater than ten, test for that, then parse and re-add. 
    //this is where the program starts to hang (I think). 
  for (i = 2; i <= 16; i + 2)
    
      array[i] = array[i] * 2;
        if (array[i] >= 10)
          
            a = (int)array[i] % 10;
            b = (int)array[i] / 10;
            array[i] = a + b; 
           
    
    printf("%f", array[i]); 
            

    //add the numbers together
    x = array[2] + array[4] + array[6] + array[8] + array[10] + array[12] + array[14] + array[16];
    y = array[1] + array[3] + array[5] + array[7] + array[9] + array[11] + array[13] + array[15];

    check = x + y;  

    //print out a test number to make sure the program is doing everything correctly. 
    //Right now, this isn't happening
    printf("%d", check);

return 0;



【问题讨论】:

【参考方案1】:
for (i = 2; i <= 16; i + 2)

应该是

for (i = 2; i <= 16; i = i + 2)

for (i = 2; i <= 16; i += 2)

正如你所拥有的,i 的值永远不会被修改,所以循环永远不会终止。

【讨论】:

没问题。但也请注意 valter 的观察 - 在您的第一个循环中,您从 15 变为 0(含),这可能是正确的。但是在这个你从 2 到 16 包括在内,这是错误的。你要么想从 0 到 14,要么从 1 到 15。16 超出了数组范围。【参考方案2】:

你声明你的数组

array[16] so array[0] .. array[15]

在第二个 for 循环中

when i = 16 array[16]!

变态

【讨论】:

感谢您指出这一点!我要对 C 说一件事,它教我像哇那样注重细节。

以上是关于程序冻结 - Luhn 算法的主要内容,如果未能解决你的问题,请参考以下文章

LUHN 信用卡验证在有效卡号上失败

为啥Luhn算法乘以2?

Luhn 算法逻辑

C:信用卡号码检查器/ Luhn 算法

增强Luhn算法的实现?

Luhn算法Ruby无法识别AMEX