C#自恋数字黑洞—水仙花数、玫瑰花数、五角星数

自恋数

当一个n位数的所有数位上数字的n次方和等于这个数本身,这个数就叫自恋数。

显然1,2,3,...,9是自恋数。【比如6的一次方仍然是6】,自恋性数字也是数字黑洞的一种。

水仙花数

三位数中的自恋数,三位数的所有数位上数字的三次方之和等于这个数本身

三位数中的自恋数有四个:153,370,371和407(这四个数被称为“水仙花数”)。

比如371=3的三次方+7的三次方+1的三次方

玫瑰花数

四位数中的自恋数,四位数的所有数位上数字的四次方之和等于这个数本身

四位的“玫瑰花数”有:1634,8208;9474;

五角星数

五位数中的自恋数,五位数的所有数位上数字的五次方之和等于这个数本身

五位的“五角星数”有:54748,92727,93084。

当数字个数大于五位时,这类数字就统称为“自幂数”。

我们使用C#程序获取10万【1~99999】以下的所有自恋数。

使用5个现场进行处理:分一位数、二位数、三位数、四位数、五位数。

控制台NarcissisticNumberDemo源程序如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace NarcissisticNumberDemo
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.SetWindowSize(110, 30);
            //当一个n位数的所有数位上数字的n次方和等于这个数本身,这个数就叫自恋数。
            //水仙花数:三位数中的自恋数,三位数的所有数位上数字的三次方之和等于这个数本身
            Task taskOne = Task.Factory.StartNew(() => 
            {
                GetScopeNarcissisticNumber(1, 10, "一");
            });
            Task taskTwo = Task.Factory.StartNew(() =>
            {
                GetScopeNarcissisticNumber(10, 100, "二");
            });
            Task taskThree = Task.Run(() =>
            {
                GetScopeNarcissisticNumber(100, 1000, "三");
            });
            Task taskFour = Task.Run(() =>
            {
                GetScopeNarcissisticNumber(1000, 10000, "四");
            });
            Task taskFive = Task.Run(() =>
            {
                GetScopeNarcissisticNumber(10000, 100000, "五");
            });
            Console.ReadLine();
        }

        /// 
        /// 获取范围内的所有自恋数
        /// 
        /// 起始数,包含此数
        /// 到倒数,不包含此数
        /// 位数
        static void GetScopeNarcissisticNumber(int from, int to, string digitInfo)
        {
            Console.WriteLine($"[{DateTime.Now.ToString("HH:mm:ss.fff")}]->获取【{digitInfo}】位数的所有自恋数:");
            int count = 0;
            for (int number = from; number < to; number++)
            {
                if (IsNarcissisticNumber(number))
                {
                    count++;
                }
            }
            Console.WriteLine($"[{DateTime.Now.ToString("HH:mm:ss.fff")}]->【{digitInfo}】位数的所有自恋数共有【{count}】个");
        }

        /// 
        /// 是否是自恋数
        /// 一个n位数的所有数位上数字的n次方和等于这个数本身,这个数就叫自恋数。
        /// 
        /// 
        /// 
        static bool IsNarcissisticNumber(int number)
        {
            if (number < 1 || number > 99999)
            {
                Console.WriteLine($"无效的数字【{number}】,请输入范围在1~99999之间的数");
                return false;
            }
            int originNumber = number;//原始数字
            Stack stack = new Stack();
            while (number != 0)
            {
                stack.Push(number % 10);
                number = number / 10;
            }
            //位数
            int digit = stack.Count;
            int sum = 0;//求和
            while (stack.Count > 0)
            {
                sum += (int)Math.Pow(stack.Pop(), digit);
            }
            if (sum == originNumber)
            {
                string description = string.Empty;
                switch (digit)
                {
                    case 3:
                        description = "【水仙花数】";
                        break;
                    case 4:
                        description = "【玫瑰花数】";
                        break;
                    case 5:
                        description = "【五角星数】";
                        break;
                }
                Console.WriteLine($"[{DateTime.Now.ToString("HH:mm:ss.fff")}]->【{digit}】位数【{originNumber}】是自恋数。{description}");
                return true;
            }
            return false;
        }
    }
}

运行如图

C#自恋数字黑洞—水仙花数、玫瑰花数、五角星数_第1张图片

你可能感兴趣的:(C#,算法与数据结构,c#,自恋数,水仙花数,玫瑰花数,五角星数)