<===
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;
}