嵌套的For循环在循环8次后不起作用

时间:2018-10-29 09:46:08

标签: c++

当我像这样四次嵌套循环时,

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测试了循环。好像循环只是停留在第一级。 第二次发布在这里,试图查看可能重复的帖子。如果我违反此处的任何规则和规定,我将删除此帖子。

2 个答案:

答案 0 :(得分:5)

数组time[257]最多可以包含257个元素。 但是time[i1 + i2 + i3 + i4 + i5 + i6 + i7 + i8]意味着索引可以上升到8 * 65 = 520,超过了限制,导致超出范围的内存访问。

这将导致undefined behaviour

  

未定义的行为-对该程序的行为没有限制。未定义行为的示例包括在数组范围之外的内存访问,有符号整数溢出,空指针取消引用,在不带序列点的表达式中多次修改同一标量,通过指针访问对象不需要编译器来诊断未定义的行为(尽管已诊断出许多简单情况),并且不需要编译程序执行任何有意义的操作。

答案 1 :(得分:2)

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

计算下一个状态n
#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;
}