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

使用while循环反向遍历std::list未得到预期结果的问题排查

问题分析与解决:std::list反向遍历计算数值错误

为什么结果是1234?

你的代码确实是反向遍历了std::list,拿到的元素顺序是4、3、2、1,但计算sum1的逻辑搞反了数字的权重:

  • 初始exp1=1,每次遍历后乘10,意味着先拿到的元素(4)被乘以最小的权重(1,个位),后拿到的元素(1)被乘以最大的权重(1000,千位)
  • 具体计算过程:
    1. 取4:sum1 = 0 + 4*1 = 4,exp1=10
    2. 取3:sum1 = 4 + 3*10 = 34,exp1=100
    3. 取2:sum1 = 34 + 2*100 = 234,exp1=1000
    4. 取1:sum1 = 234 + 1*1000 = 1234

最终就出现了和预期相反的结果。

如何修改实现预期效果?

方法一:调整求和逻辑(推荐,更简洁)

不用额外的exp1变量,每次把当前结果左移一位(乘10)再加当前元素,这样先拿到的元素会逐步被推到高位:

#include <iostream>
#include <list>

int main(){
    std::list <int> l1 = {1,2,3,4};
    auto it1 = l1.end();
    int sum1=0;
    while( it1 != l1.begin() ){
        --it1;
        sum1 = sum1 * 10 + *it1;
    }
    std::cout << sum1 << std::endl;
    return 0;
}

计算过程:

  1. 取4:sum1 = 0*10 +4 =4
  2. 取3:sum1 =4*10 +3=43
  3. 取2:sum1=43*10+2=432
  4. 取1:sum1=432*10+1=4321

方法二:修正权重计算逻辑

如果坚持用exp1的方式,可以先计算列表长度,初始权重设为10的(长度-1)次方,每次遍历后除以10:

#include <iostream>
#include <list>

int main(){
    std::list <int> l1 = {1,2,3,4};
    auto it1 = l1.end();
    int sum1=0;
    int exp1 = 1;
    int len = l1.size();
    // 计算初始权重:10^(len-1)
    for(int i=1; i<len; ++i){
        exp1 *=10;
    }
    while( it1 != l1.begin() ){
        --it1;
        sum1 += *it1 * exp1;
        exp1 /=10;
    }
    std::cout << sum1 << std::endl;
    return 0;
}

计算过程:

  1. 初始exp1=1000,取4:sum1=4*1000=4000,exp1=100
  2. 取3:sum1=4000+3*100=4300,exp1=10
  3. 取2:sum1=4300+2*10=4320,exp1=1
  4. 取1:sum1=4320+1*1=4321

内容的提问来源于stack exchange,提问作者user6669602

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 02:48:16