log_entier函数计算异常导致冒泡排序步骤输出格式错误排查
问题分析与修复:log_entier函数返回值错误导致冒泡排序输出格式异常
核心问题根源
你的log_entier函数实现存在逻辑错误,导致输入9时返回2而非预期的1。最常见的原因是误用了自然对数函数log()而非以10为底的对数函数log10(),或者循环计数逻辑多算了一次。
比如典型的错误实现(使用自然对数):
#include <math.h> int log_entier(int n) { return (int)log(n); // log(9)≈2.197,强制转int后得到2 }
自然对数log(n)计算的是底数为e的对数,而非你需要的底数为10的对数,这直接导致了返回值偏差。
针对性修复方案
根据你的需求(输入9返回1,推测是要计算数字的位数,而非严格的对数整数部分),推荐两种可靠的实现方式:
方案1:基于循环的位数计算(无浮点精度问题)
这种方式完全避免浮点运算的精度误差,适合所有正整数输入:
int log_entier(int n) { int digit_count = 0; while (n > 0) { digit_count++; n = n / 10; } return digit_count; // 输入9返回1,输入99返回2,符合预期 }
方案2:修正对数函数的使用(若确实需要对数整数部分)
如果你的需求是计算以10为底的对数的整数部分(比如输入9预期返回0,输入10预期返回1),则改用log10():
#include <math.h> int log_entier(int n) { return (int)log10(n); // log10(9)≈0.954,转int后得到0 }
注:如果你的实际需求是数字位数,方案1更稳妥,因为浮点运算在处理极大整数时可能出现精度丢失。
修复后的效果
修正log_entier函数后,print_digits会生成正确的空格数,冒泡排序步骤输出的第9步格式将与预期一致。
内容的提问来源于stack exchange,提问作者TexDuinoCpp
相关产品推荐
相关产品推荐

