使用while循环反向遍历std::list未得到预期结果的问题排查
问题分析与解决:std::list反向遍历计算数值错误
为什么结果是1234?
你的代码确实是反向遍历了std::list,拿到的元素顺序是4、3、2、1,但计算sum1的逻辑搞反了数字的权重:
- 初始
exp1=1,每次遍历后乘10,意味着先拿到的元素(4)被乘以最小的权重(1,个位),后拿到的元素(1)被乘以最大的权重(1000,千位) - 具体计算过程:
- 取4:
sum1 = 0 + 4*1 = 4,exp1=10 - 取3:
sum1 = 4 + 3*10 = 34,exp1=100 - 取2:
sum1 = 34 + 2*100 = 234,exp1=1000 - 取1:
sum1 = 234 + 1*1000 = 1234
- 取4:
最终就出现了和预期相反的结果。
如何修改实现预期效果?
方法一:调整求和逻辑(推荐,更简洁)
不用额外的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; }
计算过程:
- 取4:
sum1 = 0*10 +4 =4 - 取3:
sum1 =4*10 +3=43 - 取2:
sum1=43*10+2=432 - 取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; }
计算过程:
- 初始
exp1=1000,取4:sum1=4*1000=4000,exp1=100 - 取3:
sum1=4000+3*100=4300,exp1=10 - 取2:
sum1=4300+2*10=4320,exp1=1 - 取1:
sum1=4320+1*1=4321
内容的提问来源于stack exchange,提问作者user6669602
相关产品推荐
相关产品推荐

