Малость не по теме, но при устройстве на работу мне предложили написать такую маленькую программку, результат под катом.
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
using namespace std;
void translate(char triad[3], int num)
{
const char *hundreds[] = { "", "сто", "двести", "триста", "четыреста", "пятьсот",
"шестьсот", "семьсот", "восемьсот", "девятьсот" };
const char *tens[] = { "",
"десять", "двадцать", "тридцать", "сорок", "пятьдесят",
"шестьдесят", "семьдесят", "восемьдесят", "девяносто"
};
const char *ones[] = { "",
"один", "два", "три", "четыре", "пять", "шесть",
"семь", "восемь", "девять", "десять", "одиннадцать",
"двенадцать", "тринадцать", "четырнадцать",
"пятнадцать", "шестнадцать", "семнадцать",
"восемнадцать", "девятнадцать"
};
const char *ones_for_th[] = { "",
"одна", "две", "три", "четыре", "пять", "шесть",
"семь", "восемь", "девять", "десять",};
const char *ones_triad_name[] = {
"", "тысяча", "миллион", "миллиард", "триллион", NULL
};
const char *two_three_four_triad_name[] = {
"", "тысячи", "миллиона", "миллиарда", "триллиона", NULL
};
const char *triad_name[] = {
"", "тысяч", "миллионов", "миллиардов", "триллионов", NULL
};
printf ("%s ", hundreds[triad[0]]);
if (num == 1)
{
if (triad[1] == 1 && triad[2] != 0)
{
printf("%s ", ones[triad[2] + 10]);
printf("%s ", triad_name[1]);
}
else
{
printf("%s ", tens[triad[1]]);
if (triad[2] == 1)
{
printf("%s ", ones_for_th[1]);
printf("%s ", ones_triad_name[1]);
}
else
{
printf("%s ",ones_for_th[triad[2]]);
(triad[2] < 5 && triad[2] > 0) ? printf("%s ", two_three_four_triad_name[1]) : printf("%s ", triad_name[1]);
}
}
}
else
{
if (triad[1] == 1 && triad[2] != 0)
{
printf("%s ", ones[triad[2] + 10]);
printf("%s ", triad_name[num]);
}
else
{
printf("%s ", tens[triad[1]]);
printf("%s ", ones[triad[2]]);
if (triad[2] == 1) printf("%s ", ones_triad_name[num]);
else if (triad[2] < 5 && triad[2] > 0) printf("%s ", two_three_four_triad_name[num]);
else printf("%s ", triad_name[num]);
}
}
}
int main (int argc, char *argv[])
{
char *number = argv[1];
argc = strlen(number);
bool minus = false;
int i;
char vall[4];
if (number[0] == '-')
{
printf("минус ");
++number;
--argc;
minus = true;
}
while(number[0] == '0') // защита от идиотов
{
++number;
--argc;
}
long long value = atoll(number);
int triads;
triads = (argc / 3);
if (triads > 5)
{
printf("хочу столько в рублях, но чисел таких не знаю я");
return 0;
}
memset(vall, '0', 3);
vall[3] = '\0';
if (argc % 3 )
{
memset (vall, '0', 3 - argc % 3);
memcpy (vall + 3 - (argc % 3), number, argc % 3);
number += (argc % 3);
argc -= argc % 3;
vall[0] -= '0';
vall[1] -= '0';
vall[2] -= '0';
translate(vall, argc/ 3);
}
for (i = 0 ; i < argc / 3 ; i++)
{
memcpy(vall ,number + i * 3 , 3);
vall[0] -= '0';
vall[1] -= '0';
vall[2] -= '0';
translate(vall, argc / 3 - 1 - i );
}
printf("в десятичной \n");
if (minus) printf("минус ");
char vosmer[25];
argc = 25;
memset(vosmer, 0, 25);
char *point = vosmer + 24;
for (i = 0 ; i < sizeof(value) * 8 / 3; i++)
{
*point = (value & 0x00000001);
value = value >> 1;
*point += (value & 0x00000001)*2;
value = value >> 1;
*point += (value & 0x00000001)*4;
value = value >> 1;
--point;
}
*point = (value & 0x00000001);
value = value >> 1;
//*point += (value & 0x00000001)*2;
//value = value >> 1;
number = vosmer;
while(number[0] == 0) // защита от идиотов
{
++number;
--argc;
}
triads = (argc / 3);
if (triads > 4)
{
printf("хочу столько в рублях, но чисел таких не знаю я \n");
return 0;
}
memset(vall, 0, 3);
if (argc % 3 )
{
memset (vall, 0, 3 - argc % 3);
memcpy (vall + 3 - (argc % 3), number, argc % 3);
number += argc % 3;
argc -= argc % 3;
translate(vall, argc/ 3);
}
for (i = 0 ; i < argc / 3 ; i++)
{
memcpy(vall ,number + i * 3 , 3);
translate(vall, argc / 3 - 1 - i );
}
printf("в восмеричной \n");
printf("razmer = %i" ,sizeof(value));
return 0;
}
Комментариев нет:
Отправить комментарий