提问者:小点点

你将如何编写一个程序来检查一个数字是否是卡普雷卡?


我正在编写一个程序来检查用户输入的数字是否是卡普雷卡数(一个正方形的数字可以拆分并相加以获得原始数字),但是我只能编写一个只适用于1的程序

                double kaprekarNum = 0;
                Console.Clear();
                Console.WriteLine("Kaprekar Finder");
                Console.WriteLine("---------------");
                Console.WriteLine("Enter a number: ");
                kaprekarNum = int.Parse(Console.ReadLine());
                double kmSqr = Math.Pow(kaprekarNum, 2);
                string kmSqrString = kmSqr.ToString();
                double[] kmSqrDouble = new double[kmSqrString.Length];
                for(int i = 0; i < kmSqrString.Length; i++)
                {
                    kmSqrDouble[i] = int.Parse(kmSqrString[i].ToString());
                    kapTest = kapTest + kmSqrDouble[i];
                }
                if(kapTest == kaprekarNum)
                {
                    Console.WriteLine("{0} is a kaprekar.", kaprekarNum);
                }
                else if(kapTest != kaprekarNum)
                {
                    Console.WriteLine("{0} is not a kaprekar.", kaprekarNum);
                }
                Console.ReadKey();

正如你所看到的,程序正在将数字拆分为1位数字,这不是我想要的。我需要把它分解成各种可能的方式,然后再加起来,但我不知道如何处理这个问题。你会怎么做?


共1个答案

匿名用户

我会避免使用双代码。这里有一个简单的实现。我认为你犯了一个错误,在你的字符串上循环,而不是把它切成左右段:

int testNbr = 297;

//beware overflow potential
int testSqrd = testNbr*testNbr;

string testSqrdStr = testSqrd.ToString();

// The right-most testNbr.Length digits from the squared value
string right = testSqrdStr.Substring(testSqrdStr.Length - testNbr.ToString().Length);

// The left most remaining
string left = testSqrdStr.Substring(0, testSqrdStr.Length - right.Length);

int result = int.Parse(right) + int.Parse(left);

bool isKaprekar = testNbr == result;