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