[guest@localhost ~]$ ntow
Usage: ntow gender [ word0 word1 word2 ]
Try `ntow --help' for more information.
[guest@localhost ~]$
[guest@localhost ~]$ ntow --help
Usage: ntow gender [ word0 word1 word2 ]
Converts numbers to cardinal numbers, including units.
Range of numbers is [0; 10 ^ 36 - 1].
gender -- a letter m | f | n
(masculine, feminine and neuter)
word0 -- a unit for zero
word1 -- a unit for one
word2 -- a unit for two
Words may be empty.
--help -- display this help and exit
--version -- output version information and exit
[guest@localhost ~]$
[guest@localhost ~]$ echo 1 | ntow m ежей ёжик ёжика
один ёжик
[guest@localhost ~]$ echo 2 | ntow m ежей ёжик ёжика
два ёжика
[guest@localhost ~]$ echo 3 | ntow m ежей ёжик ёжика
три ёжика
[guest@localhost ~]$ echo 111222333444555666777888999 | ntow m ежей ёжик ёжика
сто одиннадцать септиллионов двести двадцать два секстиллиона триста тридцать три квинтиллиона четыреста сорок четыре квадриллиона пятьсот пятьдесят пять триллионов шестьсот шестьдесят шесть миллиардов семьсот семьдесят семь миллионов восемьсот восемьдесят восемь тысяч девятьсот девяносто девять ежей
[guest@localhost ~]$
#include <string.h>
#include <assert.h>
#include "triple.h"
static const char *hundreds[] = {
"сто", "двести", "триста",
"четыреста", "пятьсот", "шестьсот",
"семьсот", "восемьсот", "девятьсот"
};
static const char *teens[] = {
"одиннадцать", "двенадцать", "тринадцать",
"четырнадцать", "пятнадцать", "шестнадцать",
"семнадцать", "восемнадцать", "девятнадцать"
};
static const char *tens[] = {
"десять", "двадцать", "тридцать",
"сорок", "пятьдесят", "шестьдесят",
"семьдесят", "восемьдесят", "девяносто"
};
static const char *ten[] = {
"три",
"четыре", "пять", "шесть",
"семь", "восемь", "девять"
};
static const char *one_two[][2] = {
{ "один", "два" },
{ "одна", "две" },
{ "одно", "два" }
};
static const char *zero = "ноль";
/* get_triple: запиывает в dst словесный эквивалент
трёхзначного числа num с учётом рода g */
char *get_triple(char *dst, int num, enum gender g)
{
int d1, d2, d3;
const char *w1, *w2;
assert(num / 1000 == 0 && "the number should be in range 0-999");
if (num == 0)
return strcpy(dst, zero);
switch(g) {
case G_M:
w1 = one_two[0][0];
w2 = one_two[0][1];
break;
case G_F:
w1 = one_two[1][0];
w2 = one_two[1][1];
break;
case G_N:
w1 = one_two[2][0];
w2 = one_two[2][1];
break;
default:
assert(0 && "wrong gender");
}
assert(1 <= num && num <= 999);
d1 = num % 10;
d2 = num / 10 % 10;
d3 = num / 100 % 10;
*dst = '\0';
assert(*dst == '\0' && "the string should be prepared for strcat()");
if (d3 > 0)
strcat(dst, hundreds[d3 - 1]);
if (d2 > 0) {
if (*dst)
strcat(dst, " ");
if (d2 == 1 && d1 > 0) {
strcat(dst, teens[d1 - 1]);
return dst;
} else
strcat(dst, tens[d2 - 1]);
}
if (d1 > 0) {
if (*dst)
strcat(dst, " ");
switch (d1) {
case 1:
strcat(dst, w1);
break;
case 2:
strcat(dst, w2);
break;
default:
strcat(dst, ten[d1 - 3]);
break;
}
}
assert(*dst);
return dst;
}
shiroiДля фразы:
подскажи как лучше сделать вывод слова числом?(например одинмиллиондвестепятьдесятчетыретысячистосорокодин как 1254141)
if str(a): for i in range(1, 1000000000): result = convert_int(i) while a != result: number[i] += 1 print(number) exit()
def convert_int(string): #преобразование integer = int(string) на эту строчку
shiroiМожно, но это неверный алгоритм, за такое двойку поставят. Почему? Потому что он вредительский, из-за него будет программа виснуть всё время. Алгоритмическая сложность O(n^2) - одна из самых плохих сложностей. И это ты увидишь на экране, когда тебе в эту функцию подадут миллион таких строчных чисел. Оно просто повиснет и всё.
это конечно дико и глупо, но можно ли использовать при переводе слова в число использовать обычный перебор?
shiroiРазделителями являются нециферные слова вроде миллион, тысяча. Если при просмотре слева направо слова миллион нет, то там пустая секция получается. Если слова тысяча нет, то там тоже пустая секция. Если в конце там слов не остаётся, то там тоже пустая пустая секция будет.
как разбить строку на группы если нет разделителя?
text = "один миллион"
segmented = break_to_segments(text) # -> "один миллион | | "
parts = split_to_parts(segmented) # -> ("один", "", "")
translated_parts = translate_parts(parts) # -> ("1", "000", "000")
out = concatenate_parts(translated_parts) # -> "1.000.000"