СИ ШАРП!!!! Написать программу, которая для любого трехзначного натурального числа печатает его на естественном языке. Например, 107 → сто семь, 234 → двести тридцать четыре, 517 → пятьсот семнадцать.
var exceptionsName = GetExceptionsName(dozens + units);
if (exceptionsName != string.Empty)
{
shard += exceptionsName;
}
else
{
var dozensName = GetDozensName(dozens);
var unitsName = GetUnitsName(units);
shard += dozensName + unitsName;
}
name = shard + GetShardName(n - i + 1, hundreds, dozens, units) + name;
}
return name;
}
static string GetNumberName(int number)
{
return GetNumberName(number.ToString());
}
static void Main(string[] args)
{
var number = Console.ReadLine();
Console.WriteLine(GetNumberName(number));
}
}
}
1 votes Thanks 2
LRSM
Какой у вас порыв вдохновения, однако :) Хотя, и в моём решении тысячи и миллионы можно добавить в пару дополнительных строчек. Изначально тоже думал через ассоциативный массив делать, но потом увидел, что как-то слишком объёмно получается :)
LRSM
@MaxLevs, да, русский язык оказался слишком "вредным", что бы записать в "в пару строчек" :) Ваше решение (второе) красиво, но разбивка по 3 немного костыльная, слишком много переборов и преобразований. Можно было бы попробовать через Take.
LRSM
Также могу отметить, что у вас не решена проблема с "один тысяча" и "два тысяча". И что будет выведено, к примеру, при "1000000"? Случайно не "один миллион тысяча "?) Как вариант, с одним преобразованием: http://lrsm.ml/task/37850207
Answers & Comments
C#
Ответ:
Пример работы:
Скриншоты примеров работы во вложениях к ответу.
Код:
using System;
using System.Collections.Generic;
namespace PrintNumbersNaturaly
{
class Program
{
static string GetShardName(int n, string hundreds, string dozens, string units)
{
var d = new Dictionary<int, List<string>>
{
{1, new List<string>{"", "", ""}},
{2, new List<string>{"Тысяча ", "Тысячи ", "Тысяч "}},
{3, new List<string>{"Миллион ", "Миллиона ", "Миллионов "}},
{4, new List<string>{"Миллиард ", "Миллиарда ", "Миллиардов "}},
};
if (dozens != "1")
{
switch (units)
{
case "1":
return d[n][0];
case "2":
case "3":
case "4":
return d[n][1];
default:
return d[n][2];
}
}
return d[n][2];
}
static string GetHundredsName(string number)
{
var d = new Dictionary<string, string>
{
{"1", "Сто "}, {"2", "Двести "}, {"3", "Триста "}, {"4", "Четыреста "}, {"5", "Пятьсот "},
{"6", "Шестьсот "}, {"7", "Семьсот "}, {"8", "Восемьсот "}, {"9", "Девятьсот "}, {"0", ""}
};
return d[number];
}
static string GetDozensName(string number)
{
var d = new Dictionary<string, string>
{
{"1", "Десять "}, {"2", "Двадцать "}, {"3", "Тридцать "}, {"4", "Сорок "}, {"5", "Пятьдесят "},
{"6", "Шестьдесят "}, {"7", "Семьдесят "}, {"8", "Восемьдесят "}, {"9", "Девяносто "}, {"0", ""}
};
return d[number];
}
static string GetUnitsName(string number)
{
var d = new Dictionary<string, string>
{
{"1", "Один "}, {"2", "Два "}, {"3", "Три "}, {"4", "Четыре "}, {"5", "Пять "},
{"6", "Шесть "}, {"7", "Семь "}, {"8", "Восемь "}, {"9", "Девять "}, {"0", ""}
};
return d[number];
}
static string GetExceptionsName(string number)
{
var d = new Dictionary<string, string>
{
{"11", "Одиннадцать "}, {"12", "Двенадцать "}, {"13", "Тринадцать "}, {"14", "Четырнадцать "},
{"15", "Пятьнадцать "}, {"16", "Шестнадцать "}, {"17", "Семнадцать "}, {"18", "Восемнадцать "},
{"19", "Девятнадцать "}
};
return d.ContainsKey(number) ? d[number] : string.Empty;
}
static string GetNumberName(string number)
{
var n = (int) Math.Ceiling(number.Length / 3.0);
var k = 3 - (number.Length - 1) % 3 - 1;
number = new string('0', k) + number;
var name = "";
for (var i = n; i > 0; --i)
{
var hundreds = number[i * 3 - 3].ToString();
var dozens = number[i * 3 - 2].ToString();
var units = number[i * 3 - 1].ToString();
var shard = GetHundredsName(hundreds);
var exceptionsName = GetExceptionsName(dozens + units);
if (exceptionsName != string.Empty)
{
shard += exceptionsName;
}
else
{
var dozensName = GetDozensName(dozens);
var unitsName = GetUnitsName(units);
shard += dozensName + unitsName;
}
name = shard + GetShardName(n - i + 1, hundreds, dozens, units) + name;
}
return name;
}
static string GetNumberName(int number)
{
return GetNumberName(number.ToString());
}
static void Main(string[] args)
{
var number = Console.ReadLine();
Console.WriteLine(GetNumberName(number));
}
}
}