【问题标题】:Starting from j = i +1 vs j = 1 in a nested for loop从嵌套 for 循环中的 j = i +1 vs j = 1 开始
【发布时间】:2019-11-13 23:06:54
【问题描述】:

对于下面的一段代码,我使用了一个包含项目 {1, 2, 3} 的向量,我只想得到对乘积的总和,例如 (1*2) + ( 1*3) + (2*3) 即 11。

for(unsigned i = {0}; i < vec.size(); ++i) {
    for(unsigned j = i + 1; j < vec.size(); ++j) {
    //              ^^^^^^^            
        preresult = vec.at(i) * vec.at(j);
        result += preresult;
    }
}

问题是,当我在内循环j从1开始时,我的答案是30,只有当我改为j = i + 1时才得到正确答案。

谁能给我解释一下为什么? j = 1 不会工作得很好吗?

【问题讨论】:

  • 如果您从 1 开始,您将包含每对两次,并且每个数字的“对”与其本身。
  • int ans = 0; for(int i=0;i&lt;3;i++){ans += v[i]*v[(i+1)%3];}
  • 使用调试器,单步调试程序,你会看到它在做什么。
  • @AviBerger 请考虑将您的评论(指出所有可能对和不同对之间的区别)扩展为答案。跨度>

标签: c++ for-loop variables


【解决方案1】:

只有 3 个值,所以我们可以在很短的空间内展开循环

j = 1开始

result += vec.at(0) * vec.at(1); // 2
result += vec.at(0) * vec.at(2); // 3
result += vec.at(1) * vec.at(1); // 4 Oops: pairing 2 with itself
result += vec.at(1) * vec.at(2); // 6
result += vec.at(2) * vec.at(1); // 6 Oops: Seen already
result += vec.at(2) * vec.at(2); // 9 Oops: pairing 3 with itself

j = i + 1开始

result += vec.at(0) * vec.at(1); // 2
result += vec.at(0) * vec.at(2); // 3
result += vec.at(1) * vec.at(2); // 6

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多