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

C语言分数背包代码异常:10/3的pw_ratio输出为3.000而非3.333

问题原因与解决方法

常见原因

  • 排序函数存在类型截断:如果排序函数在交换结构体元素时,用int类型临时变量存储pw_ratio,或者在赋值、比较过程中误将浮点数强制转换为整数,就会导致10/3的浮点值被截断为3。
  • 结构体成员类型不一致:虽然main函数内计算正确,但如果sort函数接收的结构体参数中,pw_ratio被错误声明为int类型(比如函数形参的结构体定义和main中的结构体定义不统一),会触发隐式类型转换导致值被截断。
  • 排序函数参数传递错误:如果传递给sort函数的是结构体值副本而非指针,且副本的结构体定义存在类型问题,也会出现数值异常。

解决步骤

  1. 统一结构体定义:确保所有代码中用到的结构体里,pw_ratio的类型为float或double,示例:
typedef struct {
    int profit;
    int weight;
    double pw_ratio; // 用double精度更高,避免精度丢失
} Item;
  1. 修正排序函数的交换逻辑:交换结构体元素时,直接交换整个结构体对象,避免单独处理成员时的类型错误。比如冒泡排序的正确实现:
void sort(Item items[], int n) {
    for (int i = 0; i < n-1; i++) {
        for (int j = 0; j < n-i-1; j++) {
            // 按利润重量比降序排序
            if (items[j].pw_ratio < items[j+1].pw_ratio) {
                Item temp = items[j];
                items[j] = items[j+1];
                items[j+1] = temp;
            }
        }
    }
}
  1. 确认参数传递方式:调用sort函数时直接传递数组名(数组名会退化为指针),确保函数操作的是原数组而非副本,调用示例:sort(items, item_count);。
  2. 检查输出格式符:输出pw_ratio时使用对应格式符,比如double类型用%.3lf,float类型用%.3f,避免格式不匹配导致的显示异常。

额外验证点

main函数内计算pw_ratio时,确保触发浮点除法:

items[0].pw_ratio = (double)items[0].profit / items[0].weight;

必须将其中一个操作数强制转换为浮点型,否则10/3会执行整数除法得到3(你已经确认main内计算正确,这一步可快速排查)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 02:12:10