СИ ШАРП!!!! Написать программу, которая для любого трехзначного натурального числа...

+941 голосов
1.1m просмотров

СИ ШАРП!!!! Написать программу, которая для любого трехзначного натурального числа печатает его на естественном языке. Например, 107 → сто семь, 234 → двести тридцать четыре, 517 → пятьсот семнадцать.


Информатика (82 баллов) | 1.1m просмотров
+178

lrsm затащит

+188

Мне лень

Дано ответов: 2
+70 голосов

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();

Пример работы:

(3.7k баллов)
+57 голосов

Скриншоты примеров работы во вложениях к ответу.

Код:

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>

           {

               {1, new List{"", "", ""}},

               {2, new List{"Тысяча ", "Тысячи ", "Тысяч "}},

               {3, new List{"Миллион ", "Миллиона ", "Миллионов "}},

               {4, new List{"Миллиард ", "Миллиарда ", "Миллиардов "}},

           };

           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

           {

               {"1", "Сто "}, {"2", "Двести "}, {"3", "Триста "}, {"4", "Четыреста "}, {"5", "Пятьсот "},

               {"6", "Шестьсот "}, {"7", "Семьсот "}, {"8", "Восемьсот "}, {"9", "Девятьсот "}, {"0", ""}

           };

           return d[number];

       }

       

       static string GetDozensName(string number)

       {

           var d = new Dictionary

           {

               {"1", "Десять "}, {"2", "Двадцать "}, {"3", "Тридцать "}, {"4", "Сорок "}, {"5", "Пятьдесят "},

               {"6", "Шестьдесят "}, {"7", "Семьдесят "}, {"8", "Восемьдесят "}, {"9", "Девяносто "}, {"0", ""}

           };

           return d[number];

       }

       static string GetUnitsName(string number)

       {

           var d = new Dictionary

           {

               {"1", "Один "}, {"2", "Два "}, {"3", "Три "}, {"4", "Четыре "}, {"5", "Пять "},

               {"6", "Шесть "}, {"7", "Семь "}, {"8", "Восемь "}, {"9", "Девять "}, {"0", ""}

           };

           return d[number];

       }

       

       static string GetExceptionsName(string number)

       {

           var d = new Dictionary

           {

               {"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));

       }

   }

}

(6.9k баллов)
+85

Также могу отметить, что у вас не решена проблема с "один тысяча" и "два тысяча". И что будет выведено, к примеру, при "1000000"? Случайно не "один миллион тысяча "?) Как вариант, с одним преобразованием: http://lrsm.ml/task/37850207

+94

@MaxLevs, да, русский язык оказался слишком "вредным", что бы записать в "в пару строчек" :) Ваше решение (второе) красиво, но разбивка по 3 немного костыльная, слишком много переборов и преобразований. Можно было бы попробовать через Take.

+134

Спасибо огромное ребята)

+68

"в пару строчек". У меня вышло так https://snipboard.io/AE39ct.jpg. Твой варинат?

+51

Но не стал медитировать над этим