【C#】 迴圈小練習_黑洞數(Kaprekar number)

卡布列克數(Kaprekar number)

黑洞數也稱為卡布列克常數,是指一種專指四位數的特定函數關係,在某排列順序後,其演算式最後都會對應到6174。
黑洞數是指於四位數中,只要數字不完全相同,將數字由大到小的排列減去由小到大的排列。
例如:2381,經大到小排列可以列出,Max = 8321、min = 1238
8321 - 1238 = 7083 ; Max = 8730、min = 0378
8730 - 0378 = 8352 ; Max = 8532、min = 2358
8532 - 2358 = 6174 ;
這四位數字經過連續的運算後,最終都會在七次運算之內對應到6174。

using System.Linq;
 
 class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("請輸入4位數整數:");
            int x = Convert.ToInt32(Console.ReadLine());

            //驗證數字
            Console.WriteLine(String.Format("{0}驗證結果如下:", x));

            //驗證資料是不是4位數字,使用Linq..記得using System.Linq
            if (!x.ToString().All(Char.IsDigit) || x.ToString().Length != 4)
            {
                Console.WriteLine(String.Format("輸入的{0}不是4位數字:", x));
            }
            else
            {
                if (x % 1111 == 0)
                {
                    Console.Write("數字全部相同!!");
                }
                else
                {
                    int flag = 0;
                    int input = x;
                    do
                    {
                        input = maxmin(analysis(input));
                        flag++;
                    } while (input != 6174);

                    if (input == 6174)
                    {
                        Console.WriteLine(String.Format("計算了{0}次,結果值為真:", flag));

                    }
                    else //不滿足
                    {
                        Console.WriteLine(String.Format("結果值為假:"));
                    }
                }
            }
            Console.ReadLine();
        }
        //分解4位數字
        public static int[] analysis(int var)
        {
            int[] a = new int[4];
            a[0] = var / 1000;          //千位數

            var = var % 1000;           //百位數
            a[1] = var / 100;

            var = var % 100;            //十位數
            a[2] = var / 10;

            var = var % 10;             //個位數
            a[3] = var;

            Array.Sort(a);  //從小到大排序
            return a;
        }

        //求最大值減最小值以後的數字
        public static int maxmin(int[] a)
        {
            Array.Sort(a);
            int max = a[3] * 1000 + a[2] * 100 + a[1] * 10 + a[0];
            int min = a[0] * 1000 + a[1] * 100 + a[2] * 10 + a[3];
            Console.WriteLine(string.Format("{0} - {1} =  {2}", max, min, max - min));
            return max - min;
        }
    }

三位數也有一數495,任何三位數經過這樣的運算都會對應到495。

 

水滴可成涓流,涓流可成湖泊大海。
汲取累積知識,將知識堆積成常識;將常識探究成學識;將學識簡化為知識;授人自省。