C++自定义排序算法输入0时返回十的十九次方量级异常大数问题
代码问题分析及修复
核心问题点
- 输入为
0时无数字被提取:提取数字的循环for( auto tmp = a; tmp; tmp /= 10 )当a为0时,tmp初始值为0,循环直接跳过,digits容器为空,逻辑存在隐患,结合其他未定义行为会触发异常返回。 - 结果变量类型溢出:存储最终结果的
finSort被定义为int类型,32位int最大仅能存储10位以内的正整数,而uint64_t最大支持20位数字,一旦输入数字位数超过10位就会发生整数溢出,溢出属于C++未定义行为,会出现随机的异常数值,也会导致代码时好时坏的不稳定表现。 - 低版本编译环境兼容问题:
std::size是C17引入的特性,如果编译时未指定C17及以上标准,调用std::size的行为是未定义的,也会引发异常。
修复后代码
#include <cinttypes> #include <vector> uint64_t descendingOrder(uint64_t a) { std::vector<int> digits; for( auto tmp = a; tmp; tmp /= 10 ){ digits.push_back( tmp % 10 ); } // 处理输入为0的场景 if (digits.empty()) { digits.push_back(0); } bool run = true; // 冒泡降序排序 while (run) { bool change = false; // 改用digits.size()替代std::size,兼容低版本C++标准 for (unsigned long z = 1; z < digits.size(); ++z){ if (digits[z] > digits[z-1]){ int temp = digits[z]; digits[z] = digits[z-1]; digits[z-1] = temp; change = true; } } run = change; } // 改用uint64_t类型存储结果,避免溢出 uint64_t finSort = 0; for (unsigned long i = 0; i < digits.size(); i++) { finSort *= 10; finSort += digits[i]; } return finSort; }
内容的提问来源于stack exchange,提问作者Undrcvrsteve
相关产品推荐
相关产品推荐

