阿姆斯特朗数没有返回真值
本文关键字:返回 阿姆斯特朗 | 更新日期: 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;
}