<===

ProNotes

2025-09-25 16:58:29
// $ gcc -lm num.c

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include <ctype.h>

const char *units[] = {"", "один", "два", "три", "чотири", "п’ять", "шість", "сім", "вісім", "дев’ять"};
const char *units_feminine[] = {"", "одна", "дві", "три", "чотири", "п’ять", "шість", "сім", "вісім", "дев’ять"};
const char *teens[] = {"десять", "одинадцять", "дванадцять", "тринадцять", "чотирнадцять", "п’ятнадцять", "шістнадцять", "сімнадцять", "вісімнадцять", "дев’ятнадцять"};
const char *tens[] = {"", "", "двадцять", "тридцять", "сорок", "п’ятдесят", "шістдесят", "сімдесят", "вісімдесят", "дев’яносто"};
const char *hundreds[] = {"", "сто", "двісті", "триста", "чотириста", "п’ятсот", "шістсот", "сімсот", "вісімсот", "дев’ятсот"};
const char *hryvnia_suffixes[] = {"гривня", "гривні", "гривень"};
const char *kopiyky_suffixes[] = {"копійка", "копійки", "копійок"};
const char *thousands_suffixes[] = {"тисяча", "тисячі", "тисяч"};
const char *millions_suffixes[] = {"мільйон", "мільйони", "мільйонів"};
const char *billions_suffixes[] = {"мільярд", "мільярди", "мільярдів"};

void get_suffix(long num, const char *suffixes[], char *result) {
    if (num % 100 >= 10 && num % 100 <= 20) {
        strcpy(result, suffixes[2]);
    } else if (num % 10 == 1) {
        strcpy(result, suffixes[0]);
    } else if (num % 10 >= 2 && num % 10 <= 4) {
        strcpy(result, suffixes[1]);
    } else {
        strcpy(result, suffixes[2]);
    }
}

void helper(long num, int gender, char *result) {
    if (num == 0) {
        strcpy(result, "нуль");
        return;
    }
    result[0] = '\0';
    char temp[1000];

    if (num < 10) {
        strcpy(result, gender ? units_feminine[num] : units[num]);
        return;
    }
    if (num < 20) {
        strcpy(result, teens[num - 10]);
        return;
    }
    if (num < 100) {
        strcpy(result, tens[num / 10]);
        if (num % 10 != 0) {
            sprintf(temp, " %s", gender ? units_feminine[num % 10] : units[num % 10]);
            strcat(result, temp);
        }
        return;
    }
    if (num < 1000) {
        strcpy(result, hundreds[num / 100]);
        if (num % 100 != 0) {
            helper(num % 100, gender, temp);
            strcat(result, " ");
            strcat(result, temp);
        }
        return;
    }
}

void format_large_number(long num, const char *suffixes[], int gender, char *result) {
    if (num == 0) {
        result[0] = '\0';
        return;
    }
    char word[1000];
    helper(num, gender, word);
    char suffix[100];
    get_suffix(num, suffixes, suffix);
    sprintf(result, "%s %s", word, suffix);
}

void process_large_numbers(long num, int gender, char *result) {
    if (num == 0) {
        strcpy(result, "нуль");
        return;
    }
    result[0] = '\0';
    char temp[1000];

    if (num < 1000) {
        helper(num, gender, result);
        return;
    }
    if (num < 1000000) {
        long thousands = num / 1000;
        long remainder = num % 1000;
        format_large_number(thousands, thousands_suffixes, 1, temp);
        strcpy(result, temp);
        if (remainder != 0) {
            process_large_numbers(remainder, gender, temp);
            strcat(result, " ");
            strcat(result, temp);
        }
        return;
    }
    if (num < 1000000000) {
        long millions = num / 1000000;
        long remainder = num % 1000000;
        format_large_number(millions, millions_suffixes, 0, temp);
        strcpy(result, temp);
        if (remainder != 0) {
            process_large_numbers(remainder, gender, temp);
            strcat(result, " ");
            strcat(result, temp);
        }
        return;
    }
    long billions = num / 1000000000;
    long remainder = num % 1000000000;
    format_large_number(billions, billions_suffixes, 0, temp);
    strcpy(result, temp);
    if (remainder != 0) {
        process_large_numbers(remainder, gender, temp);
        strcat(result, " ");
        strcat(result, temp);
    }
}

void number_to_words_ua(double n, char *result) {
    long hryvnia = (long)n;
    long kopiyky = (long)round((n - hryvnia) * 100);

    char hryvnia_words[1000], kopiyky_words[1000];
    char hryvnia_suffix[100], kopiyky_suffix[100];

    if (hryvnia == 0) {
        strcpy(hryvnia_words, "нуль");
    } else {
        process_large_numbers(hryvnia, 1, hryvnia_words);
    }
    get_suffix(hryvnia, hryvnia_suffixes, hryvnia_suffix);

    if (kopiyky == 0) {
        strcpy(kopiyky_words, "нуль");
    } else {
        process_large_numbers(kopiyky, 1, kopiyky_words);
    }
    get_suffix(kopiyky, kopiyky_suffixes, kopiyky_suffix);

    char hryvnia_str[1000];
    sprintf(hryvnia_str, "%s %s", hryvnia_words, hryvnia_suffix);
    hryvnia_str[0] = toupper(hryvnia_str[0]);

    sprintf(result, "%s %s %s", hryvnia_str, kopiyky_words, kopiyky_suffix);
}

int main(int argc, char *argv[]) {
    if (argc != 2) {
        printf("Використання: %s <число>\n", argv[0]);
        printf("Приклад: %s 1234567890.98\n", argv[0]);
        return 1;
    }

    double amount;
    if (sscanf(argv[1], "%lf", &amount) != 1 || amount < 0) {
        printf("Помилка: Будь ласка, введіть коректне невід’ємне число.\n");
        return 1;
    }

    char result[2000];
    number_to_words_ua(amount, result);
    printf("%s\n", result);

    return 0;
}
← Previous Next →
Back to list