为什么不将10和100视为Kaprekar数字?

时间:2017-02-06 04:40:32

标签: c# algorithm math number-theory

我正在尝试修改Kaprekar数字问题(https://www.hackerrank.com/challenges/kaprekar-numbers)来描述Kaprekar数字

  

以下是维基百科关于原始Kaprekar的解释   数字(发现差异!):在数学中,一个Kaprekar数字   给定的基数是一个非负整数,其表示形式   在那个基地的正方形可以分成两个部分,加起来   再次原始号码。例如,45是Kaprekar数,因为   45²= 2025和20 + 25 = 45。

而我不明白为什么10和100不是Kaprekar数字。

10 ^ 2 = 1000且10 + 00 = 10

右?

所以我的解决方案

// Returns the number represented by the digits 
// in the range arr[i], arr[i + 1], ..., arr[j - 1].
// If there are no elements in range, return 0.
static int NumberInRange(int[] arr, int i, int j)
{
    int result = 0;
    for(; i < j; ++i)
    {
        result *= 10;
        result += arr[i];
    }
    return result;
}

// Returns true or false depending on whether k 
// is a Kaprekar number. 
// Example: IsKaprekar(45) = true because 45^2=2025 and 20+25=45
// Example: IsKaprekar(9) = false because the set of the split 
//                          digits of 7^2=49 are {49,0},{4,9} and
//                          neither of 49+0 or 4+9 equal 7.
static bool IsKaprekar(int k)
{
    int square = k * k;
    int[] digits = square.ToString().Select(c => (int)Char.GetNumericValue(c)).ToArray();
    for(int i = 0; i < digits.Length; ++i)
    {
        int right = NumberInRange(digits, 0, i);
        int left = NumberInRange(digits, i, digits.Length);
        if((right + left) == k)
            return true;
    }
    return false;
}

表示1到100之间的所有Kaprekar数字都是

1 9 10 45 55 99 100

而“正确”的答案是

1 9 45 55 99

3 个答案:

答案 0 :(得分:0)

在100 + 00中,右数为00,这是错误的,因为在kaprekar数字中,右数可能以零(例如025)开头,但不能完全为零。

因此,您可以在循环中放置一个条件

if(right==0)
     return false;

答案 1 :(得分:0)

原因是因为10 x 10 =100。然后将长度等于d = 2的右边部分进行子串处理,即原始值(10)的数字计数,那么左边部分将为1。

所以l = 1且r = 00,l + r = 1,不等于10。

对于100也是如此。100 x 100 =10000。l = 10,r = 000,所以l + r = 10不等于100。

这是我在JAVA中的解决方案。

static void kaprekarNumbers(int p, int q) {

    long[] result = IntStream.rangeClosed(p, q).mapToLong(Long::valueOf)
            .filter(v -> {
                int d = String.valueOf(v).length();
                Long sq = v * v;
                String sqSt = sq.toString();
                if (sqSt.length() > 1) {
                    long r = Long.parseLong(sqSt.substring(sqSt.length() - d));
                    long l = Long.parseLong(sqSt.substring(0, sqSt.length() - d));
                    return r + l == v;
                } else return v == 1;
            }).toArray();

    if (result.length > 0) {
        for (long l : result) {
            System.out.print(l + " ");
        }
    } else {
        System.out.println("INVALID RANGE");
    }

}

答案 2 :(得分:0)

这样的事情怎么样。

static bool IsKaprekar(int k)
{
    int t;
    for (int digits = new String(k).length(); digits > 0; digits--, t *= 10);
    long sq = k * k;
    long first = sq / t;
    long second = sq % t;
    return k == first + second;
}
  1. 找到一个数字来分割和修改正方形以进行分割。此数字应为原始数字中位数的10倍。
  2. 计算平方。
  3. 分裂广场。
  4. 将原始图像与拆分总和进行比较。