:: алгоритмы  и методы :: :: олимпиадные задачи :: :: связь :: :: о сайте ::
Путь: Математика » Разное » Запись числа прописью
  Запись числа прописью



Алгоритм довольно ясен из исходника на Си++ 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;
}