C#:内存不足异常

时间:2016-02-15 10:59:23

标签: c#

我已经编写了一个控制台应用程序

   Int64 sum = 0;
        int T = Convert.ToInt32(Console.ReadLine());
        Int64[] input = new Int64[T];
        for (int i = 0; i < T; i++)
        {
            input[i] = Convert.ToInt32(Console.ReadLine());
        }
        for (int i = 0; i < T; i++)
        {
            int[,] Matrix = new int[input[i], input[i]];
            sum = 0;
            for (int j = 0; j < input[i]; j++)
            {
                for (int k = 0; k < input[i]; k++)
                {

                    Matrix[j, k] = Math.Abs(j - k);
                    sum += Matrix[j, k];
                }
            }
            Console.WriteLine(sum);
        }

当我输入

2
1
999999

它给了Out of memory exception。你能帮忙吗?

2 个答案:

答案 0 :(得分:2)

看看你在分配什么:

input[]被分配为2个元素(16个字节) - 无后顾之忧

然后输入值:1999999并在循环的第一次迭代中尝试分配

Matrix [1,1] = 4个字节 - 再无所谓,

但第二次尝试分配

Matrix [999999,999999]

这是4 * 10e12字节,即使磁盘上有交换空间,也肯定超出了计算机的容量。

我怀疑这不是你真正想要分配的东西(你无论如何也永远无法填充或操纵那么多元素......)

如果您只是尝试按照原始代码进行计算,则无需分配或使用数组,因为您只存储一个值并立即使用该值,然后再也不会。

Int64 sum = 0;
int T = Convert.ToInt32(Console.ReadLine());

Int64[] input = new Int64[T];

for (int i = 0; i < T; i++)
    input[i] = Convert.ToInt32(Console.ReadLine());

for (int i = 0; i < T; i++)
{
    // int[,] Matrix = new int[input[i], input[i]];
    sum = 0;

    for (int j = 0; j < input[i]; j++)
        for (int k = 0; k < input[i]; k++)
            {
                //Matrix[j, k] = Math.Abs(j - k);
                //sum += Matrix[j, k];
                sum += Math.Abs(j - k);
            }
    Console.WriteLine(sum);
}

但现在要小心 - 一万亿美元将永远计算 - 它不会爆炸,但你可能想休假,结婚并生孩子才能期待结果。

答案 1 :(得分:0)

当然,不是进行完全平方的计算,而是可以计算总和:

for (int i = 0; i < T; i++)
{
    sum = 0;

    for (int j = 1, term = 0; j < input[i]; j++)
    {
        term += j;
        sum += term * 2;
    }

    Console.WriteLine(sum);
}

所以现在计算是O(n)而不是O(n ^ 2)

如果您需要知道Matrix[x,y]中的值是什么,您可以通过简单表达式Math.Abs(x - y)来计算它,因此无需存储该值。