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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 06:15:04