[英]Overflow or Memory error c++
這可以被認為是一個家庭作業問題。 這個問題是眾所周知的:“ 你有一個三角形的數字,你必須找到最大的和”
沒問題,我前段時間在 python 中做了一個解決方案,完美無瑕。 但是現在在c++中,解是75256,我的答案是9729。所以問題是類型short
溢出了。
因此,為了解決這個問題,我假設將數組更改為 int 類型可以解決所有問題。但是,當聲明數組a[1001][1001]
時,它會凍結(我猜是 memory 錯誤)。
有誰知道該怎么做? 我用另一個 int 嘗試了一些東西,每當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;
}
注意:我不是在尋找解決方案,只是一種處理溢出的好方法,示例贊賞!
如果您對 memory 有疑問,請嘗試動態分配您的數組:
short** trifield = new short[1001][1001];
你有一個 1001x1001 短褲的數組......那是 1002001*2 字節。 這一切都在您的本地堆棧上進行。 根據您的系統可能太大。 嘗試使用 malloc 為您的“三場”分配空間。 看看這對你有什么作用
您會得到堆棧溢出而不是數字溢出!
將數組移動到主外部的 static memory ,因此它不使用堆棧。
我檢查溢出的方法是檢查明顯虛假的結果。 例如,
if (myInt + 1 < myInt) {
// Overflow condition
cerr << "Overflow" << endl;
}
else {
myInt++;
}
溢出一個 int 是一個 UB。 溢出無符號整數值在標准中定義。
因此,唯一的方法是在執行操作之前手動檢查值,並確保它不會溢出。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.