Użyj rekurencji i jednej mapy, tak jak w poniższym przypadku:
#include <iostream>
#include <map>
using namespace std;
const map<long long int,string> names
{
{0,""},{1,"jeden"},{2,"dwa"},{3,"trzy"},{4,"cztery"},
{5,"piec"},{6,"szesc"},{7,"siedem"},{8,"osiem"},{9,"dziewiec"},
{10,"dziesiec"},{11,"jedenascie"},{12,"dwanascie"},{13,"trzynascie"},{14,"czternascie"},
{15,"pietnascie"},{16,"szesnascie"},{17,"siedemnascie"},{18,"osiemnasie"},{19,"dziewietnasie"},
{20,"dwadziescia"},{30,"trzydziesci"},{40,"czterdziesci"},{50,"piedziesiat"},{60,"szescdziesiat"},
{70,"siedemdziesiat"},{80,"osiemdziesiat"},{90,"dziewiecdziesiat"},{100,"sto"},{200,"dwiescie"},
{300,"trzysta"},{400,"czterysta"},{500,"piecset"},{600,"szescset"},{700,"siedemset"},{800,"osiemset"},
{900,"dziewieset"},{1000,"tys."},{1000000,"mln."},{1000000000,"mld."},{1000000000000,"bln."}
};
string translate( long long int number )
{
switch( to_string(abs(number)).size() )
{
case 1:
case 2: return number<=20?names.at(number):names.at((number/10)*10)+" "+translate(number-(number/10)*10);
case 3: return names.at((number/100)*100)+" "+translate(number-(number/100)*100);
case 4:
case 5:
case 6: return translate(number/1000)+" "+names.at(1000)+" "+translate(number-(number/1000)*1000);
case 7:
case 8:
case 9: return translate(number/1000000)+" "+names.at(1000000)+" "+translate(number-(number/1000000)*1000000);
default: break;
}
return "";
}
int main()
{
cout << translate(628165298) << endl;
return 0;
}
Jak zrozumiesz algorytm, to będziesz mogła sobie go rozszerzyć, w taki sposób aby obsługiwał liczby z zakresu 1 biliona.