有人能解释为什么我的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
有人能解释一下为什么这样的值会失败,比如: 371449635398431-应为“美国运通”,而不是“无效” 5555554444-应为“万事达卡”,而不是“无效\n” 5100-应为“万事达卡”,而不是“VISA卡” 4111111-应为“VISA”,而不是“无效”有人能解释为什么我的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
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"