#include
#include
using namespace std;
typedef unsigned long long ullong;
void sequence_Armstrong(ullong *, const size_t);
ullong pow_u(unsigned, unsigned);
void show_array(ullong *, const size_t);
int main() {
const size_t size = 20;
ullong arm[size] = {0};
sequence_Armstrong(arm, size);
show_array(arm, size);
cin.get();
return 0;
}
void show_array(ullong * arm, const size_t size) {
for (size_t n = 0; n < size; n++) cout << arm[n] << endl;
}
ullong pow_u(unsigned basis, unsigned indicator) {
double x = pow(double(basis), int(indicator));
if (x >= double(ULLONG_MAX)) return - 1;
ullong degree = basis;
for (unsigned n = 1; n < indicator; degree *= basis, n++);
return degree;
}
void sequence_Armstrong(ullong * arm, const size_t size) {
ullong k, sum;
unsigned pw, num;
size_t next = 0;
for (ullong n = 0; n < ULLONG_MAX; n++) {
k = n;
pw = 0;
sum = 0;
do {
k /= 10;
++pw;
} while (k > 0);
k = n;
double tmp;
ullong dx;
do {
num = k % 10;
dx = pow_u(num, pw);
tmp = double(dx) + sum;
if (tmp >= double(ULLONG_MAX)) {
cout << "Stack overflow" << endl;
sum = -1;
} else {
sum += dx;
k /= 10;
}
} while (k > 0);
if (ullong(sum) == n) arm[next++] = sum;
if (next == size) return;
}
}
ullong - переписать вручную.