Код:
/*
Автор кода: payalnik, он же coderhuligan
*/
//для выхода из программы нажмите ctrl + z
#include <stdio.h>
#include <string.h>
#include <locale.h>
#define TS 1
#define ML 2
#define MR 3
#define O1 0
#define O2 1
#define O3 2
char buf[255];
unsigned f=0, v;
char * pop(unsigned n){
static char *a[]={" попугай", " попугая", " попугаев"};
return a[n];
}
char * od(void){
static char a[]="одна";
return a;
}
char * dv(void){
static char a[]="две";
return a;
}
char * d0_9(unsigned n){
static char * a[]={"ноль", "один", "два", "три", "четыре",
"пять", "шесть", "семь", "восемь", "девять"};
if(n==1){v=O1;}else if(n>1 && n <5){v=O2;}else v=O3;
if(f==TS){
if(n==1){ return od();}
else
if(n==2){return dv();}
}
return a[n];
}
char * d10_19(unsigned n){
static char * a[]={"десять", "одиннадцать", "двенадцать", "тринадцать",
"четырнадцать","пятнадцать", "шестнадцать", "семнадцать", "восемнадцать",
"девятнадцать"};
v=O3;
return a[n%10];
}
char * d20_90(unsigned n){
static char * a[]={"двадцать", "тридцать", "сорок",
"пятьдесят", "шестьдесят", "семьдесят", "восемьдесят", "девяносто"
};
v=O3;
return a[n/10-2];
}
char * d100_900(unsigned n){
static char * a[]={"", "сто", "двести", "триста", "четыреста",
"пятьсот", "шестьсот", "семьсот", "восемьсот", "девятьсот"
};
v=O3;
return a[n/100];
}
char * dts(unsigned n){
static char * a[]={" тысяча", " тысячи", " тысяч"};
return a[n];
}
char * dmr(unsigned n)
{
static char * a[]={" миллиард", " миллиарда", " миллиардов"};
return a[n];
}
char * dml(unsigned n)
{
static char * a[]={" миллион", " миллиона", " миллионов"};
return a[n];
}
void dc(unsigned n){
strcat(buf, d0_9(n));
}
void dw(unsigned n){
strcat(buf, d10_19(n));
}
void ds(unsigned n){
if(n<10){dc(n);return;}else {if(n<20){dw(n);return;}}
strcat(buf, d20_90(n));
n%=10;if(n!=0){strcat(buf, " "); dc(n);}
}
void st(unsigned n){
strcat(buf, d100_900(n));
n%=100;if(n!=0){if(buf[0]!='\0')strcat(buf, " "); ds(n);}
}
void ts(unsigned n){
unsigned k=n; f=TS;
n/=1000; st(n);strcat(buf, dts(v));
k%=1000;f=0;if(n!=0){strcat(buf, " "); st(k);}
}
void ml(unsigned n){
unsigned k=n; f=ML;
n/=1000000; st(n);strcat(buf, dml(v));
n=k; n%=1000000;f=0;if(n!=0){strcat(buf, " "); ts(n);}
}
void mr(unsigned n){
unsigned k=n; f=MR;
n/=1000000000; st(n);strcat(buf, dmr(v));
n=k; n%=1000000000;f=0;if(n!=0){strcat(buf, " "); ml(n);}
}
int main(void)
{
setlocale(LC_ALL, "Ru");
unsigned k=0;
while(scanf("%d", &k)!=EOF){
if(k<10){dc(k);}
else if(k<20){dw(k);}
else if(k<100){ds(k);}
else if(k<1000){st(k);}
else if(k<1000000){ts(k);}
else if(k<1000000000){ml(k);}
else if(k<=4294967295){mr(k);}
printf("%s\n", strcat(buf, pop(v)));
buf[0]='\0';
}
return 0;
}