In this post, we will solve Modified Kaprekar Numbers HackerRank Solution. This problem (Modified Kaprekar Numbers) is a part of HackerRank Problem Solving series.
Task
A modified Kaprekar number is a positive whole number with a special property. If you square it, then split the number into two integers and sum those integers, you have the same value you started with.
Consider a positive whole number n with d digits. We square n to arrive at a number that is either 2 x d digits long or (2 x d) – 1 digits long. Split the string representation of the square into two parts, l and r. The right hand part, r must be d digits long. The left is the remaining substring. Convert those two substrings back to integers, add them and see if you get n.
Example
n = 5
d = 1
First calculate that n2 = 25. Split that into two strings and convert them back to integers 2 and 5. Test 2 + 5 = 7 != 5, so this is not a modified Kaprekar number. If n = 9, still d = 1, and n2 = 81. This gives us 1 + 8 = 9, the original n.
Note: r may have leading zeros.
Here’s an explanation from Wikipedia about the ORIGINAL Kaprekar Number (spot the difference!):
In mathematics, a Kaprekar number for a given base is a non-negative integer, the representation of whose square in that base can be split into two parts that add up to the original number again. For instance, 45 is a Kaprekar number, because 45² = 2025 and 20+25 = 45.
Given two positive integers p and q where p is lower than q, write a program to print the modified Kaprekar numbers in the range between p and q, inclusive. If no modified Kaprekar numbers exist in the given range, print INVALID RANGE
.
Function Description
Complete the kaprekarNumbers function in the editor below.
kaprekarNumbers has the following parameter(s):
- int p: the lower limit
- int q: the upper limit
Prints
It should print the list of modified Kaprekar numbers, space-separated on one line and in ascending order. If no modified Kaprekar numbers exist in the given range, print INVALID RANGE
. No return value is required.
Input Format
The first line contains the lower integer limit p.
The second line contains the upper integer limit q.
Note: Your range should be inclusive of the limits.
Constraints
- 0 < p < q < 100000
Sample Input
STDIN Function
----- --------
1 p = 1
100 q = 100
Sample Output
1 9 45 55 99
Explanation
1, 9, 45, 55, and 99 are the modified Kaprekar Numbers in the given range.
Solution – Modified Kaprekar Numbers – HackerRank Solution
C++
#include <cmath> #include <cstdio> #include <vector> #include <iostream> #include <algorithm> using namespace std; int main() { /* Enter your code here. Read input from STDIN. Print output to STDOUT */ long long p; long long q; cin>>p; cin>>q; vector<long long> res; for(long long i=p; i<=q; ++i){ long long sq = i*i; string s = to_string(sq); int d = s.size()/2; if(d == 0){ if(i == sq){ res.push_back(i); } continue; } if(stoll(s.substr(0,d))+stoll(s.substr(d,s.size()-d)) == i){ res.push_back(i); } } if(res.size()>0){ for(int i=0; i<res.size(); ++i){ cout<<res[i]<<" "; } cout<<endl;} else{ cout<<"INVALID RANGE"<<endl; } return 0; }
Python
import sys def is_kaprekar(num): if num < 4: if num == 1: return True else: return False num_sq = pow(num, 2) num_sq_str = str(num_sq) left = num_sq_str[:len(num_sq_str)//2] right = num_sq_str[len(num_sq_str)//2:] #print("left = {} right = {}".format(left, right)) if int(left) + int(right) == num: return True else: return False def kaprekarNumbers(p, q): out = [] for num in range(p, q + 1): if is_kaprekar(num): out.append(num) return out if __name__ == "__main__": p = int(input().strip()) q = int(input().strip()) result = kaprekarNumbers(p, q) if result: print (" ".join(map(str, result))) else: print("INVALID RANGE")
Java
import java.io.*; import java.util.*; public class Solution { public static void main(String[] args) throws Exception { Scanner sc = new Scanner(System.in); int p = sc.nextInt(); int q = sc.nextInt(); boolean isFirst = true; for(int i = p; i <= q; i++) if(isKaprekar(i)) { System.out.printf((isFirst) ? "%d" : " %d", i); isFirst = false; } System.out.println((isFirst) ? "INVALID RANGE" : ""); } public static boolean isKaprekar(long a) { int d = String.valueOf(a).length(); String sqr = String.valueOf(a * a); if(sqr.length() == 1) return a == 1; int idx = sqr.length() - d; long x = Long.valueOf(sqr.substring(0, idx)); long y = Long.valueOf(sqr.substring(idx)); return x + y == a; } }
Note: This problem (Modified Kaprekar Numbers) is generated by HackerRank but the solution is provided by CodingBroz. This tutorial is only for Educational and Learning purpose.