СИ ШАРП!!!! Написать программу, которая для любого трехзначного натурального числа печатает его на естественном языке. Например, 107 → сто семь, 234 → двести тридцать четыре, 517 → пятьсот семнадцать.
C#
- string[][] words =
- {
- new [] { "", "сто ", "двести ", "триста ", "четыреста ", "пятьсот ", "шестьсот ", "семьсот ", "восемьсот ", "девятьсот "},
- new [] { "", "десять ", "двадцать ", "тридцать ", "сорок ", "пятьдесят ", "шестьдесят ", "семьдесят ", "восемьдесят ", "девяносто "},
- new [] { "", "один", "два", "три", "четыре", "пять", "шесть", "семь", "восемь", "девять", },
- new [] { "", "одиннадцать", "двенадцать", "тринадцать", "четырнадцать", "пятнадцать", "шестнадцать", "семнадцать", "восемнадцать", "девятнадцать" },
- };
- int[] a = Console.ReadLine().Select(c => int.Parse(c.ToString())).ToArray();
- string s = words[0][a[0]] + (a[1] == 1 && a[2] != 0 ? words[3][a[2]] : words[1][a[1]] + words[2][a[2]]);
- Console.WriteLine(s);
- Console.ReadLine();
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));
}
}
}
- Какой у вас порыв вдохновения, однако :) Хотя, и в моём решении тысячи и миллионы можно добавить в пару дополнительных строчек. Изначально тоже думал через ассоциативный массив делать, но потом увидел, что как-то слишком объёмно получается :)