CS50 学分:总是变得无效 return
CS50 Credit: Always getting INVALID return
正在尝试从 CS50 获得积分,但我的代码一直收到无效 return。我通过使用数组来解决这个问题,尽管它可能不是最好的方法。代码编译没有问题。
我的伪代码逻辑是:
1) 获取卡号
2) 使用循环查找位数
3) 检查卡片是否包含 13、15 或 16 位数字
4) 如果是,将long中的数字写入数组
5) 有一个原始数组的副本,每隔一个数字乘以 2
6) 加乘积的位数
7) 检查卡片长度和起始数字
这是我的代码:
#include <stdio.h>
#include <cs50.h>
int main(void)
{
// Get credit card number
long num = get_long("Number: ");
// Find number of digits
int digits = 0;
while (num > 0)
{
num /= 10;
digits++;
}
// Check if number of digits is within possible range
if (digits != 13 && digits != 15 && digits != 16)
{
printf("INVALID\n");
}
int originalnumber[digits];
// Write each digit of credit card number into an array
for (int i = digits - 1; i >= 0; i--)
{
originalnumber[i] = num % 10;
num = num / 10;
}
// Multiply alternate digits by 2
int number[digits];
for (int i = 0; i < digits; i++)
{
number[i] = originalnumber[i];
}
for (int i = 1; i < digits; i+=2)
{
number[i] = number[i] * 2;
}
// Add product digits
int sum = 0;
int temp;
for (int i = 0; i < digits; i++)
{
temp = (number[i] % 10) + ((number[i] / 10) % 10);
sum = sum + temp;
}
// Check for card length and starting digits
// AMEX
if (digits == 15)
{
if (originalnumber[14] == 3 && sum % 10 == 0 && (originalnumber[13] == 4 || originalnumber[13] == 7))
{
printf("AMEX\n");
return 0;
}
}
// MasterCard
if (digits == 16)
{
if (originalnumber[15] == 5 && sum % 10 == 0 && (originalnumber[14] == 1 || originalnumber[14] == 2 || originalnumber[14] == 3 || originalnumber[14] == 4 || originalnumber[14] == 5))
{
printf("MASTERCARD\n");
return 0;
}
}
// Visa
if (digits == 13)
{
if (originalnumber[12] == 4 && sum % 10 == 0)
{
printf("VISA\n");
return 0;
}
}
if (digits == 16)
{
if (originalnumber[15] == 4 && sum % 10 == 0)
{
printf("VISA\n");
return 0;
}
}
printf("INVALID\n");
return 1;
}
我尝试了 debug50,似乎当我尝试使用 temp 和 sum 将数字加在一起时,循环完成时总和仍然为 0。我可以知道这里出了什么问题吗?我的伪代码流程是错误的还是我可能忽略了任何明显的错误? (盯着看太久了..)
提前致谢!
如果 sum
始终为 0,无论这是否如您所愿,sum % 10
将始终为 0,因此未通过测试的不是 "false"。
您应该注意 originalnumber
。
这个循环后 num
的值是多少?
while (num > 0)
{
num /= 10;
digits++;
}
正在尝试从 CS50 获得积分,但我的代码一直收到无效 return。我通过使用数组来解决这个问题,尽管它可能不是最好的方法。代码编译没有问题。
我的伪代码逻辑是:
1) 获取卡号
2) 使用循环查找位数
3) 检查卡片是否包含 13、15 或 16 位数字
4) 如果是,将long中的数字写入数组
5) 有一个原始数组的副本,每隔一个数字乘以 2
6) 加乘积的位数
7) 检查卡片长度和起始数字
这是我的代码:
#include <stdio.h>
#include <cs50.h>
int main(void)
{
// Get credit card number
long num = get_long("Number: ");
// Find number of digits
int digits = 0;
while (num > 0)
{
num /= 10;
digits++;
}
// Check if number of digits is within possible range
if (digits != 13 && digits != 15 && digits != 16)
{
printf("INVALID\n");
}
int originalnumber[digits];
// Write each digit of credit card number into an array
for (int i = digits - 1; i >= 0; i--)
{
originalnumber[i] = num % 10;
num = num / 10;
}
// Multiply alternate digits by 2
int number[digits];
for (int i = 0; i < digits; i++)
{
number[i] = originalnumber[i];
}
for (int i = 1; i < digits; i+=2)
{
number[i] = number[i] * 2;
}
// Add product digits
int sum = 0;
int temp;
for (int i = 0; i < digits; i++)
{
temp = (number[i] % 10) + ((number[i] / 10) % 10);
sum = sum + temp;
}
// Check for card length and starting digits
// AMEX
if (digits == 15)
{
if (originalnumber[14] == 3 && sum % 10 == 0 && (originalnumber[13] == 4 || originalnumber[13] == 7))
{
printf("AMEX\n");
return 0;
}
}
// MasterCard
if (digits == 16)
{
if (originalnumber[15] == 5 && sum % 10 == 0 && (originalnumber[14] == 1 || originalnumber[14] == 2 || originalnumber[14] == 3 || originalnumber[14] == 4 || originalnumber[14] == 5))
{
printf("MASTERCARD\n");
return 0;
}
}
// Visa
if (digits == 13)
{
if (originalnumber[12] == 4 && sum % 10 == 0)
{
printf("VISA\n");
return 0;
}
}
if (digits == 16)
{
if (originalnumber[15] == 4 && sum % 10 == 0)
{
printf("VISA\n");
return 0;
}
}
printf("INVALID\n");
return 1;
}
我尝试了 debug50,似乎当我尝试使用 temp 和 sum 将数字加在一起时,循环完成时总和仍然为 0。我可以知道这里出了什么问题吗?我的伪代码流程是错误的还是我可能忽略了任何明显的错误? (盯着看太久了..)
提前致谢!
如果 sum
始终为 0,无论这是否如您所愿,sum % 10
将始终为 0,因此未通过测试的不是 "false"。
您应该注意 originalnumber
。
这个循环后 num
的值是多少?
while (num > 0)
{
num /= 10;
digits++;
}