In 1949 the Indian mathematician D.R. Kaprekar discovered a class of numbers called self-numbers. For any positive integer n, define d(n) to be n plus the sum of the digits of n. (The d stands for digitadition, a term coined by Kaprekar.) For example, d(75) = 75 + 7 + 5 = 87. Given any positive integer n as a starting point, you can construct the infinite increasing sequence of integers n, d(n), d(d(n)),d(d(d(n))), .... For example, if you start with 33, the next number is 33 + 3 + 3 = 39, the next is 39 + 3 + 9 = 51, the next is 51 + 5 + 1 = 57, and so you generate the sequence
33, 39, 51, 57, 69, 84, 96, 111, 114, 120, 123, 129, 141, ...
The number n is called a generator of d(n). In the sequence above, 33 is a generator of 39, 39 is a generator of 51, 51 is a generator of 57, and so on. Some numbers have more than one generator: for example, 101 has two generators, 91 and 100. A number with no generators is a self-number. There are thirteen self-numbers less than 100: 1, 3, 5, 7, 9, 20, 31, 42, 53, 64, 75, 86, and 97.
this is the concept of self number
In c++ I put together the following code. There is nothing wrong with getting the self number, but the problem is a runtime error.
Run-Time Check Failure #2 - Stack around the variable 'arr' was corrupted.
I allocated an array of size 10000 to get a self number less than 10000, but I don't know why I get an error. I would appreciate it if you could explain it.
#include
using namespace std;
int main() {
int arr[10000] = { 0 };
for (int i = 0; i < 10; i++)
for (int j = 0; j < 10; j++)
for (int k = 0; k < 10; k++)
for (int l = 0; l < 10; l++)
arr[1001 * i + 101 * j + 11 * k + 2 * l] = 1;
for (int i = 0; i < 10000; i++) {
if (arr[i] == 0) cout <<i << endl;
}
return 0;
}
And I can't remember what I did well, but I heard that the more nested for statements, the worse it is. Would there be a problem if you code like me?
question from:
https://stackoverflow.com/questions/65557369/how-to-find-self-number-in-c