#include <iostream>
using namespace std;
// prototypes
bool isEven(int x);
bool isPrime(int x);
int transform(int x); // transform number (single)
void transform(int a[], int n); // transform array in place: calls transform(int)
int filterKeepEven(int a[], int n); // removes odd elements in-place, returns new length
int doubleIfPrime(int a[], int n); // double primes in array, returns count changed
void printArr(int a[], int n);
int main() {
int a[] = {6,5,4,3,2,11};
int n = sizeof(a)/sizeof(a[0]);
cout << "Start: "; printArr(a,n);
// multiple loops: transform entire array then filter then double primes
transform(a,n); // in-place; calls transform(int) for each element
cout << "After transform(): "; printArr(a,n);
n = filterKeepEven(a,n); // removes odd numbers; indices shift
cout << "After keep-even filter: "; printArr(a,n);
int doubled = doubleIfPrime(a,n);
cout << "After doubleIfPrime (doubled count): " << doubled << "\n";
cout << "Final: "; printArr(a,n);
return 0;
}
// single-number transform: tricky mapping: if prime -> map to previous composite logic, else reduce digits sum
int transform(int x) {
if (isPrime(x)) {
// map prime p to p-1 to make it composite (trick)
return x - 1;
} else {
// reduce digits sum (loop M)
int s = 0;
int t = x;
while (t > 0) { s += t % 10; t /= 10; } // loop N
return s;
}
}
// array transform: applies transform(int) to each element (loop O)
void transform(int a[], int n) {
for (int i = 0; i < n; i++) a[i] = transform(a[i]); // loop P
}
// filter to keep even numbers: in-place compacting; loop Q
int filterKeepEven(int a[], int n) {
int w = 0;
for (int i = 0; i < n; i++) {
if (isEven(a[i])) a[w++] = a[i]; // element kept may come from later index
}
return w;
}
// double primes in-place: counts how many were modified; loop R
int doubleIfPrime(int a[], int n) {
int cnt = 0;
for (int i = 0; i < n; i++) {
if (isPrime(a[i])) { a[i] = a[i] * 2; cnt++; } // primes doubled
}
return cnt;
}
// simple helpers
bool isEven(int x) { return x % 2 == 0; }
bool isPrime(int x) {
if (x <= 1) return false;
if (x <= 3) return true;
if (x % 2 == 0) return false;
for (int d = 3; d*d <= x; d += 2) if (x % d == 0) return false; // loop S
return true;
}
void printArr(int a[], int n) {
for (int i=0;i<n;i++) cout << a[i] << (i+1<n ? " " : "\n"); // loop T
}
