【Azure Developer】解答《美丽的数学》一书中P120页的一道谜题:寻找第四个阶乘和数

简介: 【Azure Developer】解答《美丽的数学》一书中P120页的一道谜题:寻找第四个阶乘和数

一道谜题

在观看《美丽的数学》一书中,在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

 

运行动画

 

相关文章
|
7月前
|
算法 Java
算法编程(十五):位1的个数
算法编程(十五):位1的个数
50 0
|
7月前
|
算法 搜索推荐 程序员
第四十六练 请以递归方式实现计算整数列表的和
第四十六练 请以递归方式实现计算整数列表的和
45 2
|
7月前
|
算法
蓝桥题库(X图形(矩阵))
蓝桥题库(X图形(矩阵))
|
7月前
|
算法 机器人 程序员
Scratch3.0——助力新进程序员理解程序(案例八、等差数列计算1)
Scratch3.0——助力新进程序员理解程序(案例八、等差数列计算1)
61 0
|
算法
Plant(快速幂+数学分析(没想到吧,数学无处不在))
Plant(快速幂+数学分析(没想到吧,数学无处不在))
68 0
|
Python
Python漫游数学王国 | 总体参数的区间估计
本文讨论总体参数的区间估计。
183 0
|
存储 编译器 C语言
课外闲谈4.对齐数的概念
结构体每个成员相对于结构体首地址的偏移量都是成员大小的整数倍,如有需要编译器会在成员之间加上填充字符;
114 0
课外闲谈4.对齐数的概念
蓝桥杯2019年第十届JavaB组真题题目+解析+代码+答案:4.数的分解
蓝桥杯2019年第十届JavaB组真题题目+解析+代码+答案:4.数的分解
156 0
蓝桥杯2019年第十届JavaB组真题题目+解析+代码+答案:4.数的分解
|
测试技术
蓝桥杯2020年第十一届JavaB组真题题目+解析+代码+答案:6.分类计数
蓝桥杯2020年第十一届JavaB组真题题目+解析+代码+答案:6.分类计数
89 0
蓝桥杯2020年第十一届JavaB组真题题目+解析+代码+答案:6.分类计数
|
程序员
贤鱼的刷题日常--P1022 [NOIP2000 普及组] 计算器的改良--题目详解
🍀学习了解P1022 [NOIP2000 普及组] 计算器的改良
313 0
贤鱼的刷题日常--P1022 [NOIP2000 普及组] 计算器的改良--题目详解