|
Алгоритм довольно ясен из исходника на Си++ by 'Graph'
#include <stdio.h>
#include <string.h>
#define DG_POWER 6 // Энто допустимая степень числа 1000 для __int64:
// При необходимости его легко увеличить,
struct s_POWER { // дополнив массив 'a_power' и заменив
int sex; // тип __int64 на более серьезный
char *one;
char *four;
char *many;
} a_power[]= {
{0,NULL ,NULL ,NULL }, // 1
{1,"тысяча " ,"тысячи " ,"тысяч " }, // 2
{0,"миллион " ,"миллиона " ,"миллионов " }, // 3
{0,"миллиард " ,"миллиарда " ,"миллиардов " }, // 4
{0,"триллион " ,"триллиона " ,"триллионов " }, // 5
{0,"квадриллион ","квадриллиона ","квадриллионов "}, // 6
{0,"квинтиллион ","квинтиллиона ","квинтиллионов "} // 7
};
struct s_UNIT {
char *one[2];
char *two;
char *dec;
char *hun;
} digit[10]= {
{{"" ,"" },"десять " ,"" ,"" },
{{"один " ,"одна " },"одиннадцать " ,"десять " ,"сто " },
{{"два " ,"две " },"двенадцать " ,"двадцать " ,"двести " },
{{"три " ,"три " },"тринадцать " ,"тридцать " ,"триста " },
{{"четыре ","четыре "},"четырнадцать ","сорок " ,"четыреста "},
{{"пять " ,"пять " },"пятнадцать " ,"пятьдесят " ,"пятьсот " },
{{"шесть " ,"шесть " },"шестнадцать " ,"шестьдесят " ,"шестьсот " },
{{"семь " ,"семь " },"семнадцать " ,"семьдесят " ,"семьсот " },
{{"восемь ","восемь "},"восемнадцать ","восемьдесят ","восемьсот "},
{{"девять ","девять "},"девятнадцать ","девяносто " ,"девятьсот "}
};
string dig2str (__int64 p_summa, int p_sex, char *p_one, char *p_four, char *p_many)
{
int i,mny;
string str,result="";
__int64 divisor; //делитель
a_power[0].sex = p_sex;
a_power[0].one = p_one;
a_power[0].four = p_four;
a_power[0].many = p_many;
if(p_summa == (__int64)0) return string("ноль ")+p_many;
if(p_summa < (__int64)0) {result="минус "; p_summa = -p_summa;}
for(i=0,divisor=(__int64)1; i<DG_POWER; i++)
divisor *= (__int64)1000;
for(i=DG_POWER-1; i>=0; i--){
divisor /= 1000;
mny = (int)(p_summa / divisor);
p_summa %= divisor;
str="";
if(mny==0){
if(i>0) continue;
str += a_power[i].one;
}else{
if(mny>=100){str += digit[mny/100].hun; mny%=100;}
if(mny>=20 ){str += digit[mny/10 ].dec; mny%=10; }
if(mny>=10 ) str += digit[mny-10 ].two; else
if(mny>=1 ) str += digit[mny].one[a_power[i].sex];
switch(mny){
case 1: str += a_power[i].one; break;
case 2: case 3:
case 4: str += a_power[i].four; break;
default: str += a_power[i].many; break;
};
}
result += str;
}
return result;
}
|