在阿姆斯壮号中为列表或数组分配值时遇到问题


class Program
{
static void Main(string[] args)
{
int temp;
int arm, j = 0;
List<int> armstrongnos = new List<int>();
for (int i = 1; i < 1000; i++)
{
arm= 0;
temp = i;
while (i > 0)
{
arm += (i % 10) * (i % 10) * (i % 10);
i /= 10;
}
if (arm== temp)
{
armstrongnos.Add(temp);// OutOfMemory Exception occurs whether you use array or list.
}
}
foreach (var item in armstrongnos)
{
Console.WriteLine(item);
}
Console.ReadLine();
}
}

我正在尝试打印阿姆斯特朗的黑白 1 到 1000。在上面的代码中确认它是阿姆斯特朗号之后。我正在将这些值分配给数组或列表。但是在这两种情况下我都有内存不足异常。 不明白为什么会出现这个问题。 请帮助解决问题。 我在这个代码中做错了什么。请解释一下。

您正在运行无限循环。循环的停止条件i < 1000, 但是i将始终小于1000,因为您在循环内递减它,并且while (i > 0),但i将始终大于0。无限运行,代码最终会遇到内存不足异常。

如果你想玩变量值,永远不要使用循环的i迭代器来做 - 用temp做。

for (int i = 1; i < 1000; i++)
{
arm = 0;
temp = i;
while(temp > 0)
{
arm += (temp % 10) * (temp % 10) * (temp % 10); 
temp /= 10;
}
if (arm == i)
armstrongnos.Add(i);
}
foreach (var item in armstrongnos)
Console.WriteLine(item);
Console.ReadLine();

问题是你正在修改迭代变量。

for (int i = 1; i < 1000; i++)
{
// ...
while (i > 0)
{
// ...
i /= 10;
}
// ...
}

我已经删掉了相关部分。您始终在划分迭代变量i并重新分配它。因此,它将无限期运行,并始终向列表中添加一个数字,直到它溢出。

相应地更改tempi,它应该可以工作:

temp = i;
while(temp > 0)
{
arm += (temp % 10) * (temp % 10) * (temp % 10);
temp /= 10;
}
if (arm == i)
{
armstrongnos.Add(i);
}

最新更新