【问题标题】:Nested For loop not working when looped 8 times循环 8 次时嵌套的 For 循环不起作用
【发布时间】:2018-10-29 18:30:16
【问题描述】:

当我像这样执行嵌套 for 循环 4 次时,

int time[257] = {};

for(int i1 = 1; i1 < 65; i1++)
    for(int i2 = 1; i2 < 65; i2++)
        for (int i3 = 1; i3 < 65; i3++)
            for (int i4 = 1; i4 < 65; i4++) 
                time[i1 + i2 + i3 + i4]++;

它能够正常输出。

for (int i = 1; i < 257; i++) {
    cout << time[i] << endl;
}

但是,当我将嵌套 for 循环增加到 8 次时,没有任何输出。

for (int i1 = 1; i1 < 66; i1++)
    for (int i2 = 1; i2 < 66; i2++)
        for (int i3 = 1; i3 < 66; i3++)
            for (int i4 = 1; i4 < 66; i4++)
                for (int i5 = 1; i5 < 66; i5++)
                    for (int i6 = 1; i6 < 66; i6++)
                        for (int i7 = 1; i7 < 66; i7++)
                            for (int i8 = 1; i8 < 66; i8++)
                                    time[i1 + i2 + i3 + i4 + i5 + i6 + i7 + i8]++;

我已经使用 cout 测试了循环。似乎循环只是停留在第一级。 第二次在这里发帖,尝试查看可能的重复帖子。如果我违反了此处的任何规则和规定,我将删除此帖子。

【问题讨论】:

  • 它仍在进行中...这里 66^8 = 360040606269696 次迭代
  • 请告诉我们minimal reproducible example。特别是,向我们展示time 的声明(在最内层循环的末尾,您将修改time[520])。
  • @Kozyr 这就是我所怀疑的,当我在最后一个循环中计算出时间[i1 + i2 + i3 + i4 + i5 + i6 + i7 + i8] 它只是不停地打印数字.有什么解决办法吗?
  • 正如@Kozyr 所说,实际上是 65^8 的大量迭代,速度等于每次迭代 1Ghz,您将迭代 3.5 天( (65^8) / 1000000000 / 3600 / 24 )。
  • @Logman 即使再添加一个循环(总共 5 个)也不行吗?

标签: c++


【解决方案1】:

数组time[257]最多可以有257个元素。 但是time[i1 + i2 + i3 + i4 + i5 + i6 + i7 + i8] 表示索引可以上升到8 * 65 = 520,这超出了限制,导致内存访问越界。

这将导致undefined behaviour

未定义的行为 - 对程序的行为没有限制。未定义行为的示例是数组边界之外的内存访问、有符号整数溢出、空指针取消引用、在没有序列点的表达式中多次修改同一标量、通过指针访问对象不同的类型等。编译器不需要诊断未定义的行为(尽管诊断了许多简单的情况),并且编译后的程序不需要做任何有意义的事情。

【讨论】:

  • 尝试将数组大小增加到 520。但输出仍然相同。
  • 数组大小应至少为 521,因为索引从 0 开始
  • 我已经尝试了 999,是 for 循环太长还是根本不退出循环?
  • @P.W 是的,我试过了。但所需的输出不是我想要的。如果我做了 4 个循环,输出的前 3 个数字将为零。我需要输出的是 7 个零。
  • @jonathanhojh 4 个循环需要多长时间?你等了5个循环多长时间?如果 4 次循环需要 10 秒,那么 5 次循环至少需要 10 分钟,但可能会更糟(缓存效果)。
【解决方案2】:

蛮力解决它是一个非常糟糕的主意。您必须使用dynamic programming 方法:从状态n 计算下一个状态n+1

#include <iostream>
#include <map>
using namespace std;

int main()
{
    const int N = 8;
    std::map<int, long long> W;
    for (int k = 1; k < 66; ++k) W[k] = 1;

    for (int i = 1; i < N; ++i) {
        std::map<int, long long> Q;
        for (auto const& w : W) {
            for (int k = 1; k < 66; ++k) {
                Q[w.first + k] += w.second;
            }
        }
        swap(Q, W);
    }

    for (auto const& w: W) {
        cout << w.first << ": " << w.second << endl;
    }

    return 0;
}

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-12-03
  • 1970-01-01
  • 2016-10-10
  • 1970-01-01
  • 1970-01-01
  • 2019-01-19
  • 1970-01-01
相关资源
最近更新 更多