Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.73/89: Рейтинг темы: голосов - 89, средняя оценка - 4.73
5 / 5 / 0
Регистрация: 29.10.2013
Сообщений: 155
1

Определить, есть ли в заданном числе одинаковые цифры

09.02.2014, 16:46. Показов 17913. Ответов 29
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Всем доброго времени суток, вообщем: задали задание, пользователь вводит 3-х значное число и программа определяет, есть ли в этом числе одинаковые ЦИФРЫ.
Вот мой вариант решения
C#
1
2
3
4
5
6
7
8
 var number = Convert.ToInt32(Console.ReadLine());
 
var num1 = number / 100 % 10;
var num2 = number / 10 % 10;
var num3 = number % 10;
 
if (num1 == num2 || num2 == num3 || num3 == num1) Console.WriteLine("Одинаковые цифры есть");
else Console.WriteLine("Одинаковых цифр нет");
Как еще можно его решить, проще чем этот код? Только без массивов там и т.д.
1
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
09.02.2014, 16:46
Ответы с готовыми решениями:

Определить, есть ли в числе 2 одинаковые цифры
Итак, наткнулся недавно на такую хитрую, на первый взгляд лёгкую ззадачу, но, попробывав её решить,...

Определить, есть ли в числе одинаковые цифры
Задание такое: в массиве найти сумму всех нечетных чисел и вывести это число, после этого проверить...

Определить есть ли одинаковые цифры в трехзначном числе
Написать программу, которая печатает True или False в зависимости от того, выполняются или нет...

Определить, есть ли в трехзначном числе одинаковые цифры
Здравствуйте! Помогите написать программу на С++, чтобы она отображала есть ли в трехзначном числе...

29
burning1ife
1462 / 1284 / 293
Регистрация: 21.09.2008
Сообщений: 3,438
Записей в блоге: 9
09.02.2014, 17:47 2
C#
1
2
3
4
5
            string str = "133";
 
            if (str.Length != str.Distinct().Count())
                Console.WriteLine("Одинаковые цифры есть");
            else Console.WriteLine("Одинаковых цифр нет");
0
Master of Orion
Эксперт .NET
6098 / 4954 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
09.02.2014, 17:54 3
qwiz, самый нормальный вариант у вас, не слушайте
0
5 / 5 / 0
Регистрация: 29.10.2013
Сообщений: 155
09.02.2014, 17:56  [ТС] 4
Цитата Сообщение от Psilon Посмотреть сообщение
qwiz, самый нормальный вариант у вас, не слушайте
Т.е. вполне пойдет ?
0
Master of Orion
Эксперт .NET
6098 / 4954 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
09.02.2014, 18:00 5
Лучший ответ Сообщение было отмечено Psilon как решение

Решение

qwiz, более чем.
0
burning1ife
1462 / 1284 / 293
Регистрация: 21.09.2008
Сообщений: 3,438
Записей в блоге: 9
09.02.2014, 18:19 6
Цитата Сообщение от Psilon Посмотреть сообщение
самый нормальный вариант у вас, не слушайте
Да, я представляю его размер хотя бы для 10 символов
0
5 / 5 / 0
Регистрация: 29.10.2013
Сообщений: 155
09.02.2014, 18:27  [ТС] 7
Цитата Сообщение от kenny69 Посмотреть сообщение
Да, я представляю его размер хотя бы для 10 символов
Ну мне-то 3 нужно
0
burning1ife
1462 / 1284 / 293
Регистрация: 21.09.2008
Сообщений: 3,438
Записей в блоге: 9
09.02.2014, 18:30 8
Для скольки угодно:
Цитата Сообщение от kenny69 Посмотреть сообщение
if (str.Length != str.Distinct().Count())
короче чем у вас?
0
Master of Orion
Эксперт .NET
6098 / 4954 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
09.02.2014, 18:31 9
kenny69, во-первых в задании четко сказано, что их три.

Во-вторых ваш вариант не проверяет, являются ли эти символы цифрами.

В-третьих он намного медленнее и попахивает индусским (см. лурк одноименная статья - там почти дословно ваш вариант )

И напоследок, вам нужно провериться на опасный синдром абстрактно-ориентированного программиста
0
burning1ife
1462 / 1284 / 293
Регистрация: 21.09.2008
Сообщений: 3,438
Записей в блоге: 9
09.02.2014, 18:41 10
у него тоже не проверяет, как и не проверяет, что их 3.
Тем более, что как бы дано, что это число и что трехзначное.

человек просил проще - я дал проще.

Никто и не говорил, что код быстрее, но он универсальнее(хотя, может быть, это и не нужно в данном контексте).
0
Master of Orion
Эксперт .NET
6098 / 4954 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
09.02.2014, 18:48 11
kenny69, у него вылетит исключение при неправильной строке, у вас выдаст ответ, причем с какой-то долей вероятности, что там есть одинаковые цифры. Да, можно доработать, и тогда будет и это, но смысл? Я же вам статью оставил:
  • Сегодня мы имеем проблему X
  • X – это отдельный пример более общего класса задач, который также включает Y и Z
  • Чтобы проблемы Y и Z не случились в будущем, я должен написать код, который решает X, Y и Z
Но правильнвым будет сделать только задачу X, практически всегда. Стремление сделать гибкую систему ВЕЗДЕ приводит к оверинжиниренгу и система гнется совсем не там и не так, как нужно, зато издишняя сложность присутствует.

Пусть это элементарная учебная задача, но если уж человек сделал правильно, надо его поощрить и сказать, что он сделал наилучшим образом (я так считаю).

Если требуется решить задачу Х, нужно решать задачу Х, даже если есть задачу Y и Z, которые могут появится в будущем. Если они появились - делаем рефакторинг и добавляем новые фичи. Это - оптимальный вариант, который гарантирует, что свое время вы потратите с пользой. Излишняя гибкость тоже антипаттерн.
1
burning1ife
1462 / 1284 / 293
Регистрация: 21.09.2008
Сообщений: 3,438
Записей в блоге: 9
09.02.2014, 18:55 12
Цитата Сообщение от Psilon Посмотреть сообщение
опасный синдром абстрактно-ориентированного программиста
возможно, отчасти он у меня и есть, но я бы еще поспорил, что хуже абстрактно ориентированный или конкретно ориентированный в самых крайних проявлениях. Я считаю, что надо придерживаться золотой середины. И до полностью абстрактно-ориентированного программиста мне ой как далеко, уж поверьте.

Добавлено через 5 минут
Цитата Сообщение от Psilon Посмотреть сообщение
kenny69, у него вылетит исключение при неправильной строке, у вас выдаст ответ, причем с какой-то долей вероятности, что там есть одинаковые цифры. Да, можно доработать, и тогда будет и это, но смысл? Я же вам статью оставил:
Я в своем ответе не ставил перед собой задачу написать полный исходник, а лишь быстро набросал суть короткого варианта решения.
Цитата Сообщение от Psilon Посмотреть сообщение
оверинжиниренгу и система гнется совсем не там и не так, как нужно, зато издишняя сложность присутствует.
Про все это я в курсе. Но здесь гибкость не идет за счет усложнения кода (хотя да, не более оптимальный с точки зрения скорости), а скорее наоборот.

Добавлено через 1 минуту
И изначально при написании кода я про гибкость и не думал. Цель была написать короче - понятнее.
0
Master of Orion
Эксперт .NET
6098 / 4954 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
09.02.2014, 19:05 13
kenny69, ну просто один из классических приемов индусского программирования считается проверка на то, что число принадлежит интервалу от 0 до 9 не таким кодом
C#
1
if (i >=0 && i <= 9)
а таким
C#
1
2
if (i.ToString().Length == 1)
   ...
аналогия почти прямая

Хотя если для больших чисел, то конечно да, придется думать как сделать. Но имо вариант ТСа наилучший. Смысл в том, что нельзя использовать LINQ в учебных задачах. А значит и distinct тут нельзя использовать. А без него все получится печально
0
burning1ife
1462 / 1284 / 293
Регистрация: 21.09.2008
Сообщений: 3,438
Записей в блоге: 9
09.02.2014, 19:17 14
Цитата Сообщение от Psilon Посмотреть сообщение
kenny69, ну просто один из классических приемов индусского программирования считается проверка на то, что число принадлежит интервалу от 0 до 9 не таким кодом
Код C#
1
if (i >=0 && i <= 9)
а таким
Код C#

if (i.ToString().Length == 1)
* *...
аналогия почти прямая
я аналогии не вижу, если честно, вообще.
Сказано, что вводится трехзначное число, т.е. число трехзначное уже по умолч. есть (если нет, то добавить проверку - одна строка), осталось проверить есть ли повторяющиеся символы.

Цитата Сообщение от Psilon Посмотреть сообщение
Но имо вариант ТСа наилучший. Смысл в том, что нельзя использовать LINQ в учебных задачах. А значит и distinct тут нельзя использовать. А без него все получится печально
Я, кстати, не сказал, что он хуже. Он быстрее, и значит уже лучше.
Человек попросил покороче записать - я показал как. Все.
Про linq не было ни слова, нельзя только массивы (хотя еще одно решение было бы только через них, которое я сразу и хотел предложить).
0
5 / 5 / 0
Регистрация: 29.10.2013
Сообщений: 155
09.02.2014, 19:23  [ТС] 15
kenny69, однако спасибо за ваш ответ, так же
0
burning1ife
1462 / 1284 / 293
Регистрация: 21.09.2008
Сообщений: 3,438
Записей в блоге: 9
09.02.2014, 19:29 16
Кстати, вот этот алгоритм в разы быстрее, чем у ТС (единственное, что строка это и есть массив символов)
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
 bool same = false;
            for (int i = 0; i < str.Length - 1; i++)
            {
                if (same) break;
                for (int j = i + 1; j < str.Length; j++)
                {
                    if (str[i] == str[j])
                    {
                        same = true;
                        break;
                    }
                }
            }
1. способ тс
2. мой "индуский" в одну строчку
3. мой последний.
Миниатюры
Определить, есть ли в заданном числе одинаковые цифры  
1
burning1ife
1462 / 1284 / 293
Регистрация: 21.09.2008
Сообщений: 3,438
Записей в блоге: 9
09.02.2014, 19:30 17
причем рассмотрен самый долгий вариант, часто он быстрее выполняется.
0
Master of Orion
Эксперт .NET
6098 / 4954 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
09.02.2014, 19:38 18
kenny69, не знаю, можете поиском воспользоваться, всегда считал linq в образовательных целях - злом.

Последний вариант неплох, если нужно оптимизировать кусок кода, который тормозит. Хотя наглядность несколько страдает.

Предлагаю мир на этом
0
burning1ife
1462 / 1284 / 293
Регистрация: 21.09.2008
Сообщений: 3,438
Записей в блоге: 9
09.02.2014, 20:34 19
Цитата Сообщение от Psilon Посмотреть сообщение
Последний вариант неплох, если нужно оптимизировать кусок кода, который тормозит. Хотя наглядность несколько страдает.
Вот и я про то же: наглядность. Первый метод хоть и индуский, зато наглядный, как по мне.
Цитата Сообщение от Psilon Посмотреть сообщение
Предлагаю мир на этом
А мы и не ссорились, истина ведь всегда рождается в споре. И на некоторые вещи полезно взглянуть с другой точки зрения.
Тем более, что с вашей точкой зрения я отчасти согласен.
0
1195 / 588 / 88
Регистрация: 20.09.2012
Сообщений: 1,881
10.02.2014, 12:05 20
Цитата Сообщение от kenny69 Посмотреть сообщение
строка это и есть массив символов
C#
1
2
3
4
5
6
bool same = false;
for (int i = 1; i < str.Length; i++)
{
    same = str.IndexOf(str[i - 1], i) >= 0;
    if (same) break;
}
еще быстрее
1
10.02.2014, 12:05
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
10.02.2014, 12:05
Помогаю со студенческими работами здесь

Определить есть ли среди в трехзначном числе одинаковые цифры.
Помогите решить задачу в Delphi Задача Дано целое трехзначное число. Определить есть ли...

Определить, есть ли в числе N рядом стоящие одинаковые цифры
1)В диалоговом режиме вводится некоторое число N (В диапазоне от 1 до 2000). . Все числа от 1 до N...

Определить, есть ли в числе рядом стоящие одинаковые цифры
Уважаемые программисты,нуждаюсь в помощи....в общем задание выглядит так.... Вашему варианту....

Определить, есть ли в заданном четырехзначном числе а цифры 5 и 8
люди решите задачи ((((( а то накрыло по полной 12 долгов 1)определить в qbasic есть ли в...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru