C++ 嵌套用于循环8次时不工作的循环

C++ 嵌套用于循环8次时不工作的循环,c++,C++,当我这样做了4次嵌套for循环时 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]++; int-t

当我这样做了4次嵌套for循环时

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]++;
int-time[257]={};
对于(inti1=1;i1<65;i1++)
对于(inti2=1;i2<65;i2++)
对于(inti3=1;i3<65;i3++)
对于(inti4=1;i4<65;i4++)
时间[i1+i2+i3+i4]++;
它能够正常输出

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

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

这将导致严重的后果

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


暴力是一个非常糟糕的解决方法。你必须使用以下方法:计算下一个状态
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;
}
#包括
#包括
使用名称空间std;
int main()
{
常数int N=8;
std::map W;
对于(int k=1;k<66;++k)W[k]=1;
对于(int i=1;i是否仍在进行中…这里66^8=3600406269696迭代请向我们展示a。特别是,向我们展示
时间的声明(在最内层循环的末尾,您将修改
时间[520]
。@Kozyr这是我所怀疑的,当我在最后一个循环中看到时间[i1+i2+i3+i4+i5+i6+i7+i8]它只是不停地打印数字。有什么解决办法吗?正如@Kozyr所说,它的大量迭代实际上是65^8,在每次迭代的速度等于1Ghz的情况下,你将迭代3.5天((65^8)/100000000/3600/24)。@Logman甚至增加了一个循环(总共5个)那么它就不能工作了吗?尝试将数组大小增加到520。但是输出仍然是一样的。数组大小应该至少是521,因为索引从0开始。我尝试了到999,是因为for循环太长还是它根本就没有退出循环?@P.W是的,我尝试过。但是所需的输出不是我想要的。如果我做了4 loops输出的前3个数字是零。我需要输出的是7个零。@jonathanhojh 4个循环需要多长时间?5个循环需要多长时间?如果4个循环需要10秒,那么5个循环至少需要10分钟,但可能更糟(缓存效应)。输出正是我想要的。但这段代码中有一部分我不明白。“for(auto const&w:w)”w:w是做什么的?@jonathanhojh您需要一本更为最新的书!@lightness racesinorbit谢谢!
#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;
}