Mình làm theo cách bạn này cũng khá ok nè, nhưng khúc cuối mình lưu nó vào 1 biến kết quả và return về chứ ko in ra 
// gcc *.c -o main -lm -Wall && ./main
#include <stdio.h>
#include <math.h>
int NewNumber(int n)
{
int scs0, scs1, scs2, scs3, scs4, scs5, scs6, scs7, scs8, scs9;
scs0 = scs1 = scs2 = scs3 = scs4 = scs5 = scs6 = scs7 = scs8 = scs9 = 0;
int n_digit = log10((double)n), newNumber;
while (n > 0) {
switch(n % 10) {
case 0: ++scs0; break;
case 1: ++scs1; break;
case 2: ++scs2; break;
case 3: ++scs3; break;
case 4: ++scs4; break;
case 5: ++scs5; break;
case 6: ++scs6; break;
case 7: ++scs7; break;
case 8: ++scs8; break;
case 9: ++scs9; break;
default: break;
}
n /= 10;
}
for (int i = 0; i < scs9; ++i) newNumber += 9 * ceil(pow(10.0, (double)n_digit--));
for (int i = 0; i < scs8; ++i) newNumber += 8 * ceil(pow(10.0, (double)n_digit--));
for (int i = 0; i < scs7; ++i) newNumber += 7 * ceil(pow(10.0, (double)n_digit--));
for (int i = 0; i < scs6; ++i) newNumber += 6 * ceil(pow(10.0, (double)n_digit--));
for (int i = 0; i < scs5; ++i) newNumber += 5 * ceil(pow(10.0, (double)n_digit--));
for (int i = 0; i < scs4; ++i) newNumber += 4 * ceil(pow(10.0, (double)n_digit--));
for (int i = 0; i < scs3; ++i) newNumber += 3 * ceil(pow(10.0, (double)n_digit--));
for (int i = 0; i < scs2; ++i) newNumber += 2 * ceil(pow(10.0, (double)n_digit--));
for (int i = 0; i < scs1; ++i) newNumber += ceil(pow(10.0, (double)n_digit--));
for (int i = 0; i < scs0; ++i) {
newNumber *= 10;
--n_digit;
}
return newNumber;
}
int main()
{
int n;
printf("Type n = ");
scanf("%d", &n);
printf("Result: %d\n", NewNumber(n));
return 0;
}
Mình chưa học tới bài mảng sao dùng đc @@ Vả lại còn chưa học C++ 
Mình ko ngại khi số lượng biến cần dùng là nhiều, mình chỉ ngại vì bài này mà dùng biến thì các biến sẽ khai báo với số lượng “bị động”, tức là ko biết trc bao nhiêu để khai báo, nên mình nghỉ ko khả thi 
@Phong_Ky_Vo Để e suy nghĩ theo cách anh thử, nhưng việc tìm indexofA và indexofB hơi khó đấy !