一道谜题
在观看《美丽的数学》一书中,在120页中有一道谜题:
数字145被称为一个阶乘和数, 因为它具有以下有趣的属性,如果我们将它的各位数字的阶乘相加,会得到该数字本身
1! +4! +5! = 1 + 24 + 120 = 145
数字1和2也是阶乘和数,但0不是。还剩下唯一的一个阶乘和数。看看你能不能找到它!
如果不编写计算机程序,答案很难得出: 所以,我们就通过C#来编写代码实现它.
实现代码
在这个问题上,主要的思路为:
1) 0的阶乘为1 . 即 0! = 1
2) 从数字1开始无限循环。并把 Int 转换为 Char Array,这样即可以把数字 123 拆分为 1, 2, 3.
3) 循环 Char Array数字,单独计算每一个数字的阶乘。因为计算最大数是9的阶乘,很简单,所以用一个for循环即可,无需引入数学计算类。
4) 把各部分的输出记录,并打印。
5) 当找到第四个数后,无限循环终止。
因为自己对C# 代码熟悉,所以就使用C# 实现:
static async Task Main(string[] args) { Console.WriteLine("=============S==T==A==R==T============="); int n = 1; int order = 0; int finalNumber = 0; char[] subn; string rformat1, rformat2; while (true) { rformat1 = ""; rformat2 = ""; finalNumber = 0; subn = n.ToString().ToCharArray(); //通过ToCharAarrary函数来拆分数字的位数。如 123 拆分为 1, 2,3. foreach (var s in subn) { int temp = countN(s); finalNumber += temp; rformat1 += s.ToString() + "! +"; rformat2 += temp.ToString() + " +"; } if (n == finalNumber) { order++; Console.WriteLine("== Find == :: " + rformat1.TrimEnd('+') + " = " + rformat2.TrimEnd('+') + " = " + finalNumber.ToString() + " == "); } //Console.WriteLine("== " + n.ToString() + " == "); n++; if (order == 4) break; } Console.WriteLine("============= ==E==N==D== ============="); Console.ReadKey(); } static int countN(char n) { int startNumber = Convert.ToInt32(n.ToString()); if (startNumber == 0) return 1;//0! = 1 即0的阶乘为1. int result = 1; for (int i = startNumber; i > 0; i--) { result *= i; } return result; }
运行结果如下:
=============S==T==A==R==T============= == Find == :: 1! = 1 = 1 == == Find == :: 2! = 2 = 2 == == Find == :: 1! +4! +5! = 1 + 24 + 120 = 145 == == Find == :: 4! +0! +5! +8! +5! = 24 + 1 + 120 + 40320 + 120 = 40585 == ============= ==E==N==D== =============
所以,我们找到的第四个阶乘和数为: 40585
运行动画