четверг, 1 марта 2012 г.

Перевод числа в число прописью в десятичной и в восмеричной форме

Малость не по теме, но при устройстве на работу мне предложили написать такую маленькую программку, результат под катом.

#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;

}


Комментариев нет:

Отправить комментарий