Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.76/21: Рейтинг темы: голосов - 21, средняя оценка - 4.76
0 / 0 / 0
Регистрация: 29.12.2017
Сообщений: 7

Автоматическое форматирование номера телефона

16.01.2018, 11:37. Показов 4315. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Помогите решить задачу

Ограничение времени
1 секунда
Ограничение памяти
64Mb
Ввод
input.txt
Вывод
output.txt

Неотъемлемой частью программного обеспечения любого мобильного телефона является записная книжка. В самых первых мобильных телефонах в ней можно было хранить лишь имена абонентов и их телефонные номера. В более современных моделях в ней можно также хранить множество другой полезной информации — электронный адрес человека, его фотографию, ссылки на его страницы в социальных сетях и дату его рождения. Однако, при реализации даже самой простой версии этой программы, позволяющей работать только с телефонными номерами, разработчики иногда сталкиваются с некоторыми сложностями.
Будем считать, что любой телефонный номер состоит из 11 цифр и делится на три части, каждая из которых является числом без ведущих нулей. Первая часть состоит из одной, двух или трех цифр и является кодом страны, в которой этот телефон зарегистрирован. Вторая часть может состоять из трех, четырех или пяти цифр, и может являться или кодом региона, в котором зарегистрирован номер, или кодом мобильного оператора, которому этот номер принадлежит. Третья часть состоит из всех оставшихся цифр номера и является номером конкретного абонента.
При отображении телефонного номера на экране телефона, части этого номера принято отделять друг от друга различными символами так, чтобы номер было проще прочитать и запомнить. Так, перед кодом страны обычно ставится символ «+», код региона или оператора берется в скобки, номер абонента разделяется символами «-» на несколько частей. При этом, то, на сколько частей он разбивается, напрямую зависит от количества цифр в нем:
если номер абонента состоит из трех цифр, то он представляет собой одну часть, состоящую из трех цифр;
если номер абонента состоит из четырех цифр, то он разбивается на две части, каждая из которых состоит из двух цифр;
если номер абонента состоит из пяти цифр, то он разбивается на две части, первая из которых состоит из трех цифр, а вторая — из двух;
если номер абонента состоит из шести цифр, то он разбивается на три части, каждая из которых состоит из двух цифр;
если номер абонента состоит из семи цифр, то он разбивается на три части, первая из которых состоит из трех цифр, а все остальные — из двух.

Естественно, что человек, заносящий новый номер в записную книжку своего телефона, не станет задумываться об этих правилах, а просто введет его как последовательность из 11 цифр. Однако, перед отображением номера на экране, программное обеспечение телефона должно выяснить, какая часть этого номера является кодом страны, какая — кодом региона или оператора, а какая — номером абонента, и отформатировать номер по правилам, описанным выше. Чтобы сделать эту задачу разрешимой, в память телефона записывается информация о том, какие в данный момент существуют коды государств и какие в этих государствах существуют коды операторов или регионов. Вам необходимо реализовать программу, которая, имея эту информацию, будет правильно форматировать номера, сохраненные в записной книжке телефона.
Формат ввода
Первая строка файла содержит одно целое число n (1 ≤ n ≤ 100) — количество государств, информация про телефонные коды которых записана в память телефона. Далее следуют n описаний этих государств, разделенных переводами строк.
Первая строка описания каждого государства содержит два целых числа c и k (1 ≤ c ≤ 999, 1 ≤ k ≤ 100) — телефонный код этого государства и количество операторов или регионов, существующих в этом государстве. Следующие k строк описания этого государства содержат целые числа, каждое из которых не меньше 100 и не больше 99999 — коды операторов или регионов, зарегистрированных в этом государстве.
Следующая строка входного файла содержит одно целое число m (1 ≤ m ≤ 10 000) — количество телефонных номеров, которые необходимо отформатировать. Следующие m строк содержат сами номера — строки, состоящие ровно из 11 цифр.
Гарантируется, что ни один данный вам номер невозможно разбить на код государства, код оператора или региона и номер абонента более, чем одним способом.
Формат вывода
Выведите номера, данные вам во входном файле, отформатированными по правилам, описанным в условии. Каждый номер необходимо вывести в отдельной строке. Номера необходимо выводить в том же порядке, в котором они были перечислены во входном файле.
Вместо номеров, корректного разбиения которых на код государства, код оператора или региона и номер абонента не существует, необходимо вывести слово «Incorrect».
Пример
Ввод
Вывод
2
7 3
981
3517
812
351 3
34712
1234
963
8
79818266456
35196328463
78122472557
01234567890
73517960326
35134712239
35112342013
78120102030
+7(981)826-64-56
+351(963)284-63
+7(812)247-25-57
Incorrect
+7(3517)96-03-26
+351(34712)239
+351(1234)20-13
Incorrect
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
16.01.2018, 11:37
Ответы с готовыми решениями:

Регулярка для поиска номера телефона
Привет ! Сделал такую регулярку: const string myReg1 = @"((\+38|8)?)?(?\d{3}??)?{6,14}"; Она не ловит все варианты...

Тип данных для номера телефона
Здравствуйте. Возник такой вопрос. На форме есть текстбатон, для номера телефона, через него заполняються данные в бд. Так вот, какой тип...

Неверное регулярное выражение для номера телефона
using System; using System.Text.RegularExpressions; namespace Dictionary { /// <summary> /// Компания. ///...

4
Эксперт .NET
 Аватар для Usaga
14147 / 9375 / 1351
Регистрация: 21.01.2016
Сообщений: 35,328
16.01.2018, 12:47
Gidro76, вы реально считаете, что кто-то станет эту портянку читать и вам что-то решать?
0
Эксперт .NET
 Аватар для Wolfdp
3790 / 1767 / 371
Регистрация: 15.06.2012
Сообщений: 6,543
Записей в блоге: 3
16.01.2018, 13:59
Смахивает на олимпиадное задание... кто-то жульничает.
0
16.01.2018, 14:00

Не по теме:

Цитата Сообщение от Wolfdp Посмотреть сообщение
кто-то жульничает.
Поправлю: кто-то ПЫТАЕТСЯ жульничать)

0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16129 / 11253 / 2888
Регистрация: 21.04.2018
Сообщений: 33,086
Записей в блоге: 2
14.08.2022, 14:30
Gidro76, без оптимизации:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
using static System.Console;
namespace Core2022
{
    public static partial class StaticMethods
    {
        public static void PhoneNumbersFormatting()
        {
            int countriesCount = int.Parse(ReadLine());
            Dictionary<string, HashSet<string>> countries = new(countriesCount);
 
            for (int i = 0; i < countriesCount; i++)
            {
                string[] split = ReadLine().Split(' ', StringSplitOptions.TrimEntries | StringSplitOptions.RemoveEmptyEntries);
 
                int regionsCount = int.Parse(split[1]);
                HashSet<string> regions = new HashSet<string>(regionsCount);
                for (int j = 0; j < regionsCount; j++)
                {
                    regions.Add(ReadLine());
                }
                countries.Add(split[0], regions);
            }
 
            int numbersCount = int.Parse(ReadLine());
            string[] numbers = new string[numbersCount];
            for (int i = 0; i < numbersCount; i++)
            {
                try
                {
                    numbers[i] = PhoneNumberFormatting(ReadLine(), countries);
 
                }
                catch (Exception ex)
                {
                    numbers[i] = ex.Message;
                }
            }
            WriteLine(string.Join(Environment.NewLine, numbers));
        }
 
        public static string PhoneNumberFormatting(string phoneNumber, Dictionary<string, HashSet<string>> countries)
        {
            if (phoneNumber[0] != '0')
            {
                foreach (var countryCode in countries.Keys.OrderBy(key => key.Length))
                {
                    if (phoneNumber.StartsWith(countryCode))
                        return $"+{countryCode}{NumberRegions(phoneNumber.Substring(countryCode.Length), countries[countryCode])}";
                }
            }
            throw new Exception("Incorrect");
        }
 
        private static string NumberRegions(string phoneNumber, HashSet<string> regions)
        {
            if (phoneNumber[0] != '0')
            {
                foreach (var regionCode in regions.OrderBy(region => region.Length))
                {
                    if (phoneNumber.StartsWith(regionCode))
                        return $"({regionCode}){NumberFormat(phoneNumber.Substring(regionCode.Length))}";
                }
            }
            throw new Exception("Incorrect");
        }
 
        private static string NumberFormat(string phoneNumber)
        {
            if (phoneNumber[0] == '0')
                phoneNumber = string.Empty;
            return phoneNumber.Length switch
            {
                3 => phoneNumber,
                4 => phoneNumber.Insert(2, "-"),
                5 => phoneNumber.Insert(3, "-"),
                6 => phoneNumber.Insert(4, "-").Insert(2, "-"),
                7 => phoneNumber.Insert(5, "-").Insert(3, "-"),
                _ => throw new Exception("Incorrect"),
            };
        }
    }
}
Добавлено через 13 минут
Блин!
Старую тему подняли, а даже не обратил внимания на это.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
14.08.2022, 14:30
Помогаю со студенческими работами здесь

Регулярные выражения для номера телефона с кодом
Всем привет В общем, нужно ввести номер телефона с кодом и при выводе этого номера на экран выделить этот код цветом Вот мой код, но...

Проблема с регулярным выражением проверки номера телефона
Доброго времени суток. Возникла проблема в регуляркой- /^(\+7|8){1}(\s|\-|\()?\d{3}(\s|\-|\))?\d{3}(\s|\-)?\d{2}(\s|\-)?\d{2}$/ она...

C# регулярное выражение для формирования номера телефона
Всем привет! Что-то никак не могу составить регулярное выражение, для удаления лишних символов из строки, которая являеться номером...

Поиск по первым трем цифрам номера телефона
Помогите пожалуйста доделать поиск по первым трем цифрам номера телефона. Вот кодclass zapis { private String _famil; ...

Написать регулярное выражение, выполняющее проверку правильности номера телефона
Написать регулярное выражение, выполняющее проверку правильности номера телефона. Номер должен соответствовать шаблону: ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru