阿姆斯特朗数没有返回真值

本文关键字:返回 阿姆斯特朗 | 更新日期: 2023-09-27 17:57:32

我写了一个小程序来确定这个数字是否是Armstrong数。

对于大多数数字,它运行良好,但也有一些数字(例如8208)应该返回true,但它们返回false。

public static bool IsArmstrong(string numValue)
    {
        int sum = 0;
        int intValue = Int32.Parse(numValue);
        for (int i = intValue; i > 0; i = i / 10)
        {
            sum = sum + (int)Math.Pow(i % 10, 3.0);
        }
        if (sum == intValue)
            return true;
        else
            return false;
    }

我浏览了其他几篇关于阿姆斯特朗数字的帖子。据我所见,我使用的是正确的公式。

我是不是遗漏了什么?

我使用字符串值作为输入的原因是我从文本文件中计算数字。

阿姆斯特朗数没有返回真值

您的算法始终使用3.0作为位数,其中"8028"有4位。由于您将输入作为字符串传递,因此可以使用其length作为电源(前提是没有空格等):(int)Math.Pow(i % 10, numValue.Length)

另一种选择是,由于输入已经是一个字符串,您可以枚举其字符来进行求和:(ascii值-'0')

public static bool IsArmstrong(string numValue)
{
    int pow = numValue.Length;
    return numValue.Sum(c=> Math.Pow(c-'0', pow)) == int.Parse(numValue);
}

这里有一个变体,用于检查armstrong数。基于此,可能会快一点

public static bool IsArmstrong(string numValue)
{
        long n;
        if (!long.TryParse(numValue, out n))
        {
            throw new Exception($"{numValue} not a number");
        }
        long c = 0, a;
        long temp = n;
        while (n > 0)
        {
            a = n % 10;
            n = n / 10;
            c = c + (int)Math.Pow(a,numValue.Length);
        }
        if (temp == c)
            return true;
        else
            return false;
}

有趣的是,我运行你的代码没有任何问题,这是我做的测试代码。

    static void Main(string[] args)
    {
        Stopwatch sw = new Stopwatch();
        sw.Start();
        for (long i = 0; i < 100000; i++)
        {
            if (IsArmstrong(i.ToString()))
                Console.WriteLine(i + " " + IsArmstrong(i.ToString()));
        }
        Console.WriteLine($"DONE in {sw.ElapsedMilliseconds} ms");
        sw.Restart();
        for (long i = 0; i < 100000; i++)
        {
            if (IsArmstrong2(i.ToString()))
                Console.WriteLine(i + " " + IsArmstrong2(i.ToString()));
        }
        Console.WriteLine($"DONE in {sw.ElapsedMilliseconds} ms");
        Console.WriteLine(IsArmstrong2("548834"));
        Console.ReadKey();
    }
    public static bool IsArmstrong(string numValue)
    {
        long sum = 0;
        long longValue = long.Parse(numValue);
        for (long i = longValue; i > 0; i = i / 10)
        {
            sum = sum + (long)Math.Pow(i % 10, numValue.Length);
        }
        if (sum == longValue)
            return true;
        else
            return false;
    }
    public static bool IsArmstrong2(string numValue)
    {
        long n;
        if (!long.TryParse(numValue, out n))
        {
            throw new Exception($"{numValue} not a number");
        }
        long c = 0, a;
        long temp = n;
        while (n > 0)
        {
            a = n % 10;
            n = n / 10;
            c = c + (int)Math.Pow(a,numValue.Length);
        }
        if (temp == c)
            return true;
        else
            return false;
    }