我正在尝试修改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
答案 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;
}