У меня конечно код не такой компакный, но на мой взгляд более понятный:
(Оффтоп)
Код:
// ***********************************************************************************
// функция обрабатывает по три цифры
QString fnThreeDigitText(int xx)
{
QString edn[] = {"", "один", "два", "три", "четыре", "пять",
"шесть", "семь", "восемь", "девять", "десять",
"одиннадцать", "двенадцать", "тринадцать",
"четырнадцать", "пятнадцать", "шестнадцать",
"семнадцать", "восемнадцать", "девятнадцать"
};
QString dec[] = {"двадцать", "тридцать", "сорок", "пятьдесят",
"шестьдесят", "семьдесят", "восемьдесят", "девяносто"};
QString han[] = {"сто", "двести" ,"триста", "четыреста", "пятьсот",
"шестьсот", "семьсот", "восемьсот", "девятьсот"};
QString str;
int y = xx / 100;
if(y > 0) str = han[y-1] + " ";
xx = xx % 100;
y = xx / 10;
if(xx > 19)
{
str += dec[y-2] + " ";
xx = xx % 10;
}
str += edn[xx];
return str;
}
// ***********************************************************************************
// функция превращения числа в строку слов
QString fnOllDigitsText(qint64 xx)
{
// return если ноль
if(xx == 0) return "ноль";
int y, z, Cx = 0;
QString s1, s2, rez;
QString gig[] = {"", "тысяч", "миллион", "миллиард", "триллион"};
// собсна процесс превращения числа в строку слов
while(xx > 0)
{
if(xx % 1000)
{
y = xx % 10;
z = xx % 100;
s1 = fnThreeDigitText(xx % 1000);
s2 = gig[Cx];
// отсюда начинаются шаманские танцы с бубном
// с целью изменения склонений и спряжений
if(Cx == 1)
{
if((z < 10) || (z > 20))
{
if(y == 1) s2 += "а";
if((y > 1) && (y < 5)) s2 += "и";
if(y == 1) s1.replace(s1.length()-2, 2, "на");
if(y == 2) s1.replace(s1.length()-2, 2, "ве");
}
}
if(Cx > 1)
{
if((z > 10) && (z < 21)) s2 += "ов";
else if((y > 1) && (y < 5)) s2 += "а";
else if((y == 0) || (y > 4)) s2 += "ов";
}
// конец шаманских танцев с бубном
rez = "\n" + s1 + " " + s2 + ", " + rez;
}
Cx++;
xx = xx / 1000;
}
// удаляем лишние последние пробелы и запятые
y = rez.length(); Cx = 0;
while(y--)
{
if((rez.at(y) == ' ')||(rez.at(y) == ',')) Cx++;
else break;
}
rez.resize(rez.length() - Cx);
// удаляем непечатные символы с начала и конца строки
// и добавляем точку в конце
rez = rez.trimmed(); // + ".";
// делаем первую букву заглавной
rez[0] = rez.at(0).toUpper();
return rez;
}
Для автора темы, изучающего програмирование с нуля, сразу такая программа сложновата будет, ИМХО. На его месте (как и любого обучаемого) я бы начал с систем счисления - написал программу, переводящую число в 16-ричное и 2-ичное. Разумеется, переводящую без использования встроенных функций.