c语言 - 如何解决像" signed integer overflow: 2147483644 + 4 cannot be represented in type 'int' "这样的运行时错



我什至尝试使用long int代替int,但是编译器执行的时间太长,仍然没有给出任何输出。

我正在使用CS50的IDE。

这是我导致问题的代码:

int sum_alt = 0;
int sum_rest = 0;
int total = 0;
for(int i = 1; i < count; i=+2)
{
int temp = number[i] * 2;
sum_alt = sum_alt + temp;
}
for(int i = 0; i <= count; i=+2)
{
int temp = number[i];
sum_rest = sum_rest + temp;
}
total = sum_rest + sum_alt;

如何解决这个问题?

以下是完整代码:

#include <stdio.h>
#include <cs50.h>
int main(void)
{
long long Cardnumber;
//Typos correction + User input
do
{
Cardnumber = get_long_long("Number: ");
}
while(Cardnumber < 0);
int count = 0;
long long counter = Cardnumber;
//To count the number of digits
while(counter != 0)
{
counter = counter / 10;
count++;
}
//Declaring an array for cardnumber
printf("%i", count);
int number[count];
if((count != 13) && (count != 15) && (count != 16))
{
printf("INVALIDn");
}
for(int access = 0; access < count; access++)
{
number[access] = Cardnumber % 10;
Cardnumber = Cardnumber / 10;
}
int originalnumber[count];
for(int i = 0; i < count; i++)
{
originalnumber[i] = number[i];
}
long long int sum_alt = 0;
long long int sum_rest = 0;
long long int total = 0;
for(int i = 1; i < count; i=+2)
{
int temp = number[i] * 2;
sum_alt = sum_alt + temp;
}
for(int i = 0; i < count; i=+2)
{
int temp = number[i];
sum_rest = sum_rest + temp;
}
total = sum_rest + sum_alt;
if(total % 10 == 0)
{
if(((count == 13) || (count == 16)))
{
if((originalnumber[12] == 4) || originalnumber[15] == 4)
{
printf("VISAn");
}
else if(originalnumber[15]== 5)
{
if(originalnumber[14] == 1 || originalnumber[14]== 2 || originalnumber[14] == 3 || originalnumber[14] == 4 || originalnumber[14] == 5)
{
printf("MASTERCARDn");
}
}
else
{
printf("INVALIDn");
}
}
else if (count == 15)
{
if(originalnumber[15] == 3)
{
if(originalnumber[15] == 4 || originalnumber[15] == 7)
{
printf("AMERICAN EXPRESSn");
}
else
{
printf("INVALIDn");
}
}
else
{
printf("INVALIDn");
}
}
}
else
{
printf("INVALIDn");
}   
}

附言。我不明白为什么CS50的IDE需要这么多时间来计算。

这是因为2147483644 + 4 = 2147483648 它大于 2147483647(这是有符号的 int32 限制(。64位整数类型是longlongint,AFAIK。

所以它应该是:

long long int sum_alt = 0;
long long int sum_rest = 0;
long long int total = 0;
for(int i = 1; i < count; i=+2)
{
int temp = number[i] * 2;
sum_alt = sum_alt + temp;
}
for(int i = 0; i <= count; i=+2)
{
int temp = number[i];
sum_rest = sum_rest + temp;
}
total = sum_rest + sum_alt;

附言此外,变量"count"不是根据此代码定义的,因此可能存在问题。

以下代码从用户处获取信用卡号,检查其长度并检查总和,并确定颁发机构。

该程序可以使用从 https://ccardgenerator.com/获得的信用卡号进行测试。

此代码的属性是

  • 它不会输入可能确实溢出的整数
  • 它处理一系列字符
  • Luhn算法正确实现(number[i]*2的数字必须相加(
  • 我改进了测试以识别信用卡发卡机构(基于前 4 位数字(;原始代码中有很多错误
#include <stdio.h>
#include <ctype.h>
int main()
{
char buf[32];
printf("enter credit card number: ");
fgets(buf, sizeof(buf), stdin);
int len = 0;
while(isdigit(buf[len]))
len++;
if(len < 13 || len > 16) {
printf("INVALIDn");
return 1;
}
// verify credit card number check sum
int checkSum = 0;
for(int i = 0; i < len; i++) {
int d = buf[len-i-1] - '0'; // get digit from right most to left most 
if((i&1) == 0)
checkSum += d;
else
checkSum += (d*2)%10 + (d*2)/10;
}
if(checkSum%10 != 0) {
printf("INVALIDn");
return 1;
}
// determine issuer (see https://www.regular-expressions.info/creditcard.html)
int start = (buf[0]-'0')*1000 + (buf[1]-'0')*100 + (buf[2]-'0')*10 + buf[3]-'0';
if((len == 13 || len == 16) && start/1000 == 4) {
printf("VISAn");
} else if(len == 16 && ((start >= 5100 && start < 5600) || (start >= 2221 && start <= 2720))) {
printf("MASTERCARDn");
} else if(len == 15 && ((start >= 3400 && start < 3500) || (start >= 3700 && start < 3800))) {
printf("AMERICAN EXPRESSn");
} else if(len == 14 && ((start >= 3000 && start < 3060) || start/100 == 36 || start/100 == 38)) {
printf("DINERS CLUBn");
} else if(len == 16 && (start == 6011 || start/100 == 65)) {
printf("DISCOVERn");
} else if((len == 15 && (start == 2131 || start == 1800)) || (len == 16 && start/100 == 35)) {
printf("JCBn");
} else {
printf("UNKNOWNn");
}
return 0;
}

相关内容

最新更新