有人能解释为什么我的luhn';s算法失败了? #包括 #包括 #包括 #包括 短无符号整数n(无符号长n); bool-isValidCC(无符号长整型n); 无符号短整数first_n_nums(无符号短整数n,无符号短整数x); 内部主(空) { 无符号长数值=0; num=获取长(“输入您的卡号”); 如果(numlen(num)==15&(first_n_nums(num,2)==34 | | first_n_nums(num,2)==37)&&isValidCC(num)==true) { printf(“美国运通”); } else if((numlen(num)==13 | | numlen(num)==16)和&first_n_nums(num,1)==4和&isValidCC(num)==true) { printf(“VISA卡”); } 否则如果(numlen(num)==16&(first|n|nums(num,2)==51|first|n|nums(num,2)==52|first|n|nums(num,2)==53|first|n|nums(num,2)==54|first|n|nums(num,2)==55&&isValidCC(num)==true) { printf(“万事达卡”); } 其他的 { printf(“无效\n”); } } 无符号短整数first_n_nums(无符号短整数n,无符号短整数x) { 而(n>pow(10,x)) { n/=10; } 返回n; } 短无符号整数n(无符号长n) { 短无符号整数计数=0; 而(n!=0) { n/=10;//删除最后一位数字 count++;//计算删除的位数 } 返回计数; } bool isValidCC(无符号长整型n) { //接受用户输入并将元素反向添加到数组中 int arr1[(numlen(n))];//声明但不能初始化n的数组; 对于(int i=0;i

有人能解释为什么我的luhn';s算法失败了? #包括 #包括 #包括 #包括 短无符号整数n(无符号长n); bool-isValidCC(无符号长整型n); 无符号短整数first_n_nums(无符号短整数n,无符号短整数x); 内部主(空) { 无符号长数值=0; num=获取长(“输入您的卡号”); 如果(numlen(num)==15&(first_n_nums(num,2)==34 | | first_n_nums(num,2)==37)&&isValidCC(num)==true) { printf(“美国运通”); } else if((numlen(num)==13 | | numlen(num)==16)和&first_n_nums(num,1)==4和&isValidCC(num)==true) { printf(“VISA卡”); } 否则如果(numlen(num)==16&(first|n|nums(num,2)==51|first|n|nums(num,2)==52|first|n|nums(num,2)==53|first|n|nums(num,2)==54|first|n|nums(num,2)==55&&isValidCC(num)==true) { printf(“万事达卡”); } 其他的 { printf(“无效\n”); } } 无符号短整数first_n_nums(无符号短整数n,无符号短整数x) { 而(n>pow(10,x)) { n/=10; } 返回n; } 短无符号整数n(无符号长n) { 短无符号整数计数=0; 而(n!=0) { n/=10;//删除最后一位数字 count++;//计算删除的位数 } 返回计数; } bool isValidCC(无符号长整型n) { //接受用户输入并将元素反向添加到数组中 int arr1[(numlen(n))];//声明但不能初始化n的数组; 对于(int i=0;i,c,if-statement,cs50,C,If Statement,Cs50,有人能解释一下为什么这样的值会失败,比如: 371449635398431-应为“美国运通”,而不是“无效” 5555554444-应为“万事达卡”,而不是“无效\n” 5100-应为“万事达卡”,而不是“VISA卡” 4111111-应为“VISA”,而不是“无效” 4222222-应为“VISA”,而不是“无效”您的问题在于您的功能 #include <math.h> #include <stdio.h> #include <stdbool.h> #inc

有人能解释一下为什么这样的值会失败,比如:

371449635398431-应为“美国运通”,而不是“无效”

5555554444-应为“万事达卡”,而不是“无效\n”

5100-应为“万事达卡”,而不是“VISA卡”

4111111-应为“VISA”,而不是“无效”


4222222-应为“VISA”,而不是“无效”

您的问题在于您的功能

#include <math.h>
#include <stdio.h>
#include <stdbool.h>
#include <cs50.h>

short unsigned int numlen(unsigned long long n);
bool isValidCC(unsigned long long int n);
unsigned short int first_n_nums(unsigned short int n, unsigned short int x);


int main(void) 
{
    unsigned long long num = 0;
    num = get_long("Enter your card number ");
    
    if(numlen(num) == 15 && (first_n_nums(num, 2) == 34 || first_n_nums(num, 2) == 37) && isValidCC(num) == true)
    {
        printf("AMEX\n");
    }
    else if((numlen(num) == 13 || numlen(num) == 16)  && first_n_nums(num, 1) == 4 && isValidCC(num) == true)
    {
        printf("VISA\n");
    }
    else if(numlen(num) == 16 && (first_n_nums(num, 2) == 51 || first_n_nums(num, 2) == 52 || first_n_nums(num, 2) == 53 || first_n_nums(num, 2) == 54 || first_n_nums(num, 2) == 55)  && isValidCC(num) == true)
    {
        printf("MASTERCARD\n");
    }
    else
    {
        printf("INVALID\n");
    }

    
}

unsigned short int first_n_nums(unsigned short int n, unsigned short int x)
{
    while(n > pow(10,x))
    {
        n /= 10;
    }
    return n;
}    
    
   

short unsigned int numlen(unsigned long long n)
{
    short unsigned int count = 0;
    while (n !=0)
    {
        n /= 10;  //removes last digit
        count++; //counts the num of digits removed
    }
    return count;
}

bool isValidCC(unsigned long long int n)
{

    // take user input and add elements to array in reverse
     int arr1[(numlen(n))]; // declares but can't Initialize an array of n ;
     
     for (int i = 0; i < (int)sizeof(arr1)/sizeof(int) ; i++)
    {
        arr1[i] = 0;
    }
    
    for (int i = 0 ; i <(int) (sizeof(arr1)/sizeof(int)) ; i++)
    {
        arr1[i] = n % 10; //Appends last digit to an array
        n /= 10; // removes that last digit
    }
    
    
    // since arr1 = x digits long, arr2 is every second digit so its x/2 long 
     int arr2[((sizeof(arr1)/sizeof(int))*2)];
    
    //initializing garbage data to 0
    for (int i = 0; i < sizeof(arr2)/sizeof(int) ; i++)
    {
        arr2[i] = 0;
    }
    
    // multiplies, seperates, and sums arr2 elements
    int sum_of_arr2 = 0;
    for (int i = 1,  a = 0,  b = 0 ; i < (sizeof(arr1)/sizeof(int)) ; i += 2) // sizeof(array) = n of elements * sizeof(type of n)
    {
        a = arr1[i] * 2;
        if( a > 9)
        {
            b = a % 10;
            a /= 10;
            arr2[i] = b;
            sum_of_arr2 += b;
        }
        arr2[i-1] = a; // cz i currenrly is one idex ahead
        sum_of_arr2 += a;
    }
    
    // adds other elements of arr1 to sum_of_arr2
    for (int i = 0 ; i < (sizeof(arr1)/4) ; i += 2) // sizeof(array) = n of elements * sizeof(type of n)
    {
        sum_of_arr2 += arr1[i];
    }
    
    // returns true or false
    if (sum_of_arr2 % 10 != 0)
    {
        return false;
    }
    else
    {
        return true;
    }
}
您传递的是
无符号短整型
而不是
无符号长整型
,因此只需获取
无符号短整型
的最大值,而不是实际值

输出:

    unsigned short int first_n_nums(unsigned short int n, unsigned short int x)

我们需要先看看
nums
isValidCC
numlen
有什么帮助。这段代码不会编译,所以我们甚至不能做出很好的猜测。我会打开一个调试器,看看每个函数返回的是什么,以使每个函数都按照您的预期运行……与其产生FP错误,不如将
while(n>pow(10,x))
移动到一个基于整数的解决方案中。您不应该使用浮点来实现这些。事实上,您可能不应该使用整数。字符串将提供不受长度限制的更通用的表示形式同样,数组的归零也是无用的,因为你无论如何都要填写每个数字…今天是学习使用调试器的好日子。每天都是学习使用调试器的好时机。这也是学习单元测试概念的好日子。您的
首先\u n\u nums
是否做了您希望它做的事情?
    371449635398431 - "AMEX\n"

    5555555555554444 - "MASTERCARD\n"

    5105105105105100- "MASTERCARD\n"

    4111111111111111 - "INVALID\n" - Note that the output you said you were expecting is incorrect because the input length is 14 instead of 13.

    4222222222222 - "VISA\n"