这可以被视为一个家庭作业问题。 这个问题众所周知:“you have a triangle of numbers and you have to find the greatest sum”
没问题,我前段时间在python中做过一个解决方案,工作完美无缺。
但现在在c ++中,解决方案是75256,我的答案是9729。
所以问题是类型short
溢出。
所以为了解决这个问题,我假设将我的数组更改为int类型将解决所有问题..但是,当声明数组a[1001][1001]
时,它会冻结(我猜内存错误)。
a
中的值大于32767时,它会增加,但我的解决方案仍然是300? (代码可以工作 - 在许多较小的代码上测试)
#include <iostream>
#include <fstream>
int main() {
std::ofstream fout ("numtri.out");
std::ifstream fin ("numtri.in");
short trifield[1001][1001] = {0};
int Rows, tmp=0;
fin >> Rows;
for (int x = 0; x<Rows;x++)
for (int nr = 0; nr<=x;nr++){
fin >> tmp;
trifield[x][nr] = tmp;}
for (int y = (Rows-2); y > -1; y--)
for (int x = 0; x <= y+1; x++) {
int a = trifield[y+1][x];
int b = trifield[y+1][x+1];
if (a > b) trifield[y][x] += a;
else trifield[y][x] += b;
}
fout << trifield[0][0] << std::endl;
return 0;
}
注意:我不是在寻找解决方案,只是处理溢出的好方法,示例赞赏!
答案 0 :(得分:3)
如果您遇到内存问题,请尝试动态分配数组:
short** trifield = new short[1001][1001];
答案 1 :(得分:2)
你有一个1001x1001短裤阵列......那是1002001 * 2字节。这一切都在你的local stack。取决于你的系统可能太大了。尝试使用malloc为“trifield”分配空间。看看它为你做了什么
答案 2 :(得分:1)
你得到堆栈溢出而不是数字溢出!
将数组移动到main之外的静态内存中,因此它不使用堆栈。
答案 3 :(得分:1)
我检查溢出的方法是检查明显的虚假结果。例如,
if (myInt + 1 < myInt) {
// Overflow condition
cerr << "Overflow" << endl;
}
else {
myInt++;
}
答案 4 :(得分:0)
溢出int是一个UB。溢出无符号的int值在标准中定义。
因此,唯一的方法是在执行操作之前手动检查值,并确保它不会溢出。