我已经编写了一个控制台应用程序
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
。你能帮忙吗?
答案 0 :(得分:2)
看看你在分配什么:
input[]
被分配为2个元素(16个字节) - 无后顾之忧
然后输入值:1
和999999
并在循环的第一次迭代中尝试分配
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)
来计算它,因此无需存储该值。