C语言分数背包代码异常:10/3的pw_ratio输出为3.000而非3.333
问题原因与解决方法
常见原因
- 排序函数存在类型截断:如果排序函数在交换结构体元素时,用
int类型临时变量存储pw_ratio,或者在赋值、比较过程中误将浮点数强制转换为整数,就会导致10/3的浮点值被截断为3。 - 结构体成员类型不一致:虽然main函数内计算正确,但如果
sort函数接收的结构体参数中,pw_ratio被错误声明为int类型(比如函数形参的结构体定义和main中的结构体定义不统一),会触发隐式类型转换导致值被截断。 - 排序函数参数传递错误:如果传递给
sort函数的是结构体值副本而非指针,且副本的结构体定义存在类型问题,也会出现数值异常。
解决步骤
- 统一结构体定义:确保所有代码中用到的结构体里,
pw_ratio的类型为float或double,示例:
typedef struct { int profit; int weight; double pw_ratio; // 用double精度更高,避免精度丢失 } Item;
- 修正排序函数的交换逻辑:交换结构体元素时,直接交换整个结构体对象,避免单独处理成员时的类型错误。比如冒泡排序的正确实现:
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; } } } }
- 确认参数传递方式:调用
sort函数时直接传递数组名(数组名会退化为指针),确保函数操作的是原数组而非副本,调用示例:sort(items, item_count);。 - 检查输出格式符:输出
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
相关产品推荐
相关产品推荐

