You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

CS50信用卡项目运行报错:Floating point exception (core dumped)

问题分析与修复

触发“Floating point exception (core dumped)”的核心原因

你的代码异常源于整数溢出:

  • validation函数里的i和j是int类型,而16位信用卡号需要i增长到10^15才能遍历目标数字,但int的最大值仅为2147483647(约2e9),远小于10^15。当i持续乘以100时,会超出int范围触发溢出,溢出后的值可能变为负数甚至0,后续循环执行number / i时会出现除以0的情况,触发浮点异常。

其他逻辑错误

除异常问题外,代码还有多处规则错误:

  • Visa卡的有效位数是13或16位,你错误写成了13或14位,导致16位Visa无法被识别
  • American Express的起始数字为34或37,你错误包含了35
  • 信用卡通过Luhn验证但不符合任何卡种规则时,程序无输出,应输出INVALID

修复后的代码

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

bool validation(long long number) {
    // 改用long long避免整数溢出
    long long i = 10;
    long long j = 1;
    int totalMultiplied = 0;
    int totalNotMultiplied = 0;

    while (number / i != 0){
        int digit = (number / i) % 10;
        int product = digit * 2;
        // Luhn算法要求将乘积的各位数字相加,而非直接加乘积
        totalMultiplied += (product / 10) + (product % 10);
        i *= 100;
    }
    while (number / j != 0) {
        totalNotMultiplied += (number / j) % 10;
        j *= 100;
    }

    return ((totalMultiplied + totalNotMultiplied) % 10 == 0);
}

int main(void) {
    long long creditCardNo;
    do {
        creditCardNo = get_long("Enter credit card number: ");
    }
    while (creditCardNo < 0);

    int count = 0;
    long long startNumbers = creditCardNo;
    long long n = creditCardNo;

    do {
        n /= 10;
        count++;
    }
    while (n != 0);

    while (startNumbers >= 100) {
        startNumbers /= 10;
    }

    if (validation(creditCardNo)) {
        if (count == 15 && (startNumbers == 34 || startNumbers == 37)) {
            printf("AMEX\n");
        }
        else if (count == 16 && (startNumbers >= 51 && startNumbers <= 55)) {
            printf("MASTERCARD\n");
        }
        else if ((count == 13 || count == 16) && (startNumbers / 10 == 4)) {
            printf("VISA\n");
        }
        else {
            // 验证通过但无匹配卡种,输出INVALID
            printf("INVALID\n");
        }
    } else {
        printf("INVALID\n");
    }
}

关键修复说明

  1. 类型调整:将所有涉及卡号存储和位数遍历的变量改为long long类型,确保能容纳16位信用卡号,彻底避免溢出。
  2. Luhn算法修正:修复了乘2后数字的累加逻辑,改为将乘积的各位数字相加,符合算法要求。
  3. 卡种规则修正:修正Visa位数、American Express起始数字的错误,补充验证通过但无匹配卡种时的INVALID输出逻辑。

内容的提问来源于stack exchange,提问作者Tobi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 11:47:27