自恋数
当一个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();}/// <summary>/// 获取范围内的所有自恋数/// </summary>/// <param name="from">起始数,包含此数</param>/// <param name="to">到倒数,不包含此数</param>/// <param name="digitInfo">位数</param>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}】个");}/// <summary>/// 是否是自恋数/// 一个n位数的所有数位上数字的n次方和等于这个数本身,这个数就叫自恋数。/// </summary>/// <param name="number"></param>/// <returns></returns>static bool IsNarcissisticNumber(int number){if (number < 1 || number > 99999){Console.WriteLine($"无效的数字【{number}】,请输入范围在1~99999之间的数");return false;}int originNumber = number;//原始数字Stack<int> stack = new Stack<int>();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;}}}