#include <iostream>
using namespace std;
int transform(int x); // digit-sum squared
void transform(int a[], int n); // apply transform(int) to array elements
int transform(int x, int factor); // call transform(int) then scale
void composeTransforms(int a[], int &n); // calls other transforms and appends meta-values
void printArr(int a[], int n);
int main() {
int a[10] = {12, 7, 5};
int n = 3;
cout << "Before: ";
printArr(a,n);
transform(a,n); // element-wise
cout << "After element-wise transform: ";
printArr(a,n);
int v = transform(14, 3);
cout << "transform(14,3) -> " << v << "\n";
composeTransforms(a,n); // chaining: modifies and appends two meta values
cout << "After composeTransforms: ";
printArr(a,n);
return 0;
}
int transform(int x) {
int s = 0, t = x;
while (t > 0) { s += t % 10; t /= 10; }
return s * s; // square of digit-sum (tricky non-linear)
}
void transform(int a[], int n) {
for (int i = 0; i < n; i++) a[i] = transform(a[i]);
}
int transform(int x, int factor) {
int base = transform(x); // uses transform(int)
return base * factor;
}
void composeTransforms(int a[], int &n) {
transform(a,n); // first pass
int s = 0;
for (int i = 0; i < n; i++) s += a[i];
a[n++] = s; // append sum
a[n++] = transform(s); // append transform(sum)
// second pass over new array
transform(a,n);
}
void printArr(int a[], int n) {
for (int i = 0; i < n; i++) cout << a[i] << (i+1<n? " " : "\n");
}
