在Armstrong No。中为List或Array分配值时遇到问题

时间:2017-08-07 12:44:47

标签: c#

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();
    }
}

我正在尝试将强制打印no.s / w 1打印到1000.在上面的代码中确认它是一个非常强的没有。我将这些值分配给数组或列表。但是我在这两种情况下都有outofMemory Exception。 无法理解为什么会出现这个问题。 请帮助解决问题。 我在本准则中做错了什么。请解释一下。

2 个答案:

答案 0 :(得分:2)

您正在运行无限循环。你的循环停止条件是i < 1000, 但是i 总是小于1000,因为你在循环中将其减少,while (i > 0),但i 总是 大于0。无限运行,您的代码最终会遇到OutOfMemory Exception。

如果您想使用变量值,从不使用循环的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();

答案 1 :(得分:1)

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

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);
}