Below is my solution to the Programming Praxis problem from Sept. 21, 2010. The problem was to find all Kaprekar numbers less than 1000. I wrote my solution in C++ to refresh my skills a little. For more info, seeĀ this link.
// Author: William Clausen
// Date: Aug. 10, 2014
// Description: Programming Praxis problem from Sep. 21, 2010
// Write a program to determine Kaprekar numbers less than a given input
#include <vector>
#include <iostream> // for testing in main
#include <cmath> // for pow
using namespace std;
// Helper function that returns a power of 10 where the exponent is equal
// to the number of digits in number
int numDigits(int number) {
int result = 1;
// Next, add the appropriate number of zeros to the result.
while (result < number) {
result *= 10;
}
return result;
}
// Helper function that returns true if the input is a Kaprekar number and
// false otherwise.
bool isKaprekar(int number) {
int square = pow(number, 2);
// We need to know the number of digits in the input so figure that out.
// Get a power of ten where the exponent equals the number of digits
int modulo = numDigits(number);
// Get the last n digits of the square
int lastNDigits = square % modulo;
// Get the first n or n-1 digits
int firstDigits = square / modulo;
// Add these numbers to determine if it's a Kaprekar number
if (lastNDigits + firstDigits == number) {
return true;
}
return false;
}
// Function that returns a vector of all Kaprekar numbers less than the input.
vector<int> kaprekar(int limit) {
// Create the vector of Kaprekar numbers to be returned
vector<int> result;
// Loop through all the numbers and if they are kaprekar numbers, add them
// to the vector.
for (int i = 0; i < limit; ++i) {
if (isKaprekar(i)) {
result.push_back(i);
}
}
return result;
}
int main() {
// Determine the Kaprekar numbers less than 1000.
vector<int> answer = kaprekar(1000);
cout << "The Kaprekar numbers less than 1000 are: ";
for (int i = 0; i < answer.size(); ++i) {
cout << answer[i] << ", ";
}
cout << "\n";
}