C++链表逆序转数字函数reverseNum返回值异常问题排查
链表逆序转数字返回结果错误:预期4321实际得到4320
问题原因
你的reverseNum函数中使用了pow()函数计算10的幂次,但pow()是浮点数运算函数,存在精度误差。以链表1->2->3->4为例:
- 遍历到最后一个节点(值为1)时,
pow(10,3)的实际计算结果可能是999.9999999999999,而非精确的1000 - 该值与1相乘后得到
999.9999999999999,赋值给int类型变量时会被截断为999 - 最终总和为
4 + 30 + 200 + 999 = 4320,与预期的4321不符
解决方案
放弃使用pow(),改用整数乘法累积位数,完全避免浮点数精度问题。修改后的reverseNum函数如下:
int reverseNum(Node *head){ int ans=0; int multiplier=1; // 初始为10^0 while (head!=nullptr){ ans += head->data * multiplier; cout<<ans<<"-"; multiplier *= 10; // 每次循环升级为下一个10的幂次 head=head->next; } return ans; }
原理说明
整数乘法是精准运算,multiplier会依次变为1、10、100、1000...,对应10的0次、1次、2次、3次幂,这样计算出来的每一位贡献值都是精确的,最终结果会正确返回4321。
内容的提问来源于stack exchange,提问作者Amit Kumar
相关产品推荐
相关产品推荐

