Форум программистов, компьютерный форум CyberForum.ru

Задача:Определить повторяются Цифры в Числе или нет... - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 23, средняя оценка - 5.00
Vepsar
 Аватар для Vepsar
32 / 32 / 6
Регистрация: 11.08.2011
Сообщений: 158
11.08.2011, 11:19     Задача:Определить повторяются Цифры в Числе или нет... #1
Нужно ввести число и в результате получить сообщение повторяются цифры в числе или нет.Способ определения может быть любым. Число нужно вводить полностью(не через пробел
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.08.2011, 11:19     Задача:Определить повторяются Цифры в Числе или нет...
Посмотрите здесь:

C++ Определить номер цифры в числе
C++ Определить порядковый номер его максимальной цифры в числе
Определить количество повторений в числе заданной цифры C++
C++ Задача( составить программу, которая определяет верно ли что в заданном числе все цифры стоят по возрастанию)
Определить, какие цифры встречаются в числе несколько раз C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Сыроежка
Заблокирован
11.08.2011, 14:19     Задача:Определить повторяются Цифры в Числе или нет... #21
Как-то в другой теме, связанной с разбиением числа на цифры я говорил, что все подобные задачи решаются универсальным способом: написанием входного итератора, который возвращает очередную цифру числа. Если такой итератор написать, то любая подобная задача решается очень просто. Конеяно этот подход не для студентов, которым нужно быстро сделать какую-то частную задачу.
Здесь я поокажу, как выглядет код, когда имеется подобный итератор. Я пропущу заголовочные файлы, чтобы меньше нужно было вводить кода

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
int main()
{
   long x;
 
   std::cin >> x;
 
   long digits[10] = {};
 
   bool repeat = false;
 
   usr::digital_iterator<long> first( x ), last;
   for ( ; first != last ; ++ first )
   {
      if ( ( repeat = ++digits[*first] > 1 ) == true ) break;
   }
 
   if ( repeat ) std::cout << "Digit " << *first << " is repeated\n";
   else std::cout << "There is no repeated digit\n";
 
   return ( 0 );
}
Преимущество такого подхода состоит в том, что вы лишь один раз пишите подобный входной итератор и с помощью него можете решить любую задачу, где требуется разложение числа на цифры. Более того вы можете с этим итераторм использовать любой алгоритм!
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
diagon
Higher
 Аватар для diagon
1920 / 1186 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
11.08.2011, 15:02     Задача:Определить повторяются Цифры в Числе или нет... #22
C++
1
2
3
4
5
6
7
8
9
#include <iostream>
#include <algorithm>
#include <iterator>
int main(){
    std::string str(std::istream_iterator<char>(std::cin), std::istream_iterator<char>() );
    bool is_unique = true;
    std::for_each(str.begin() + 1, str.end(), [&](const char ch){ static char prev = str[0]; if (ch == prev) is_unique = false;     prev = ch; } );
    std::cout << std::boolalpha << is_unique << std::endl;
}
Сыроежка
Заблокирован
11.08.2011, 15:19     Задача:Определить повторяются Цифры в Числе или нет... #23
Цитата Сообщение от diagon Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
9
#include <iostream>
#include <algorithm>
#include <iterator>
int main(){
    std::string str(std::istream_iterator<char>(std::cin), std::istream_iterator<char>() );
    bool is_unique = true;
    std::for_each(str.begin() + 1, str.end(), [&](const char ch){ static char prev = str[0]; if (ch == prev) is_unique = false;     prev = ch; } );
    std::cout << std::boolalpha << is_unique << std::endl;
}
Интересный нестандартный код. Но у меня такой вопрос, выдаст ли он правильный результат для числа, например, 121? Ведь у вас идет сравнение текущего символа только с предыдущим?
diagon
Higher
 Аватар для diagon
1920 / 1186 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
11.08.2011, 15:26     Задача:Определить повторяются Цифры в Числе или нет... #24
Цитата Сообщение от Сыроежка Посмотреть сообщение
Интересный нестандартный код. Но у меня такой вопрос, выдаст ли он правильный результат для числа, например, 121? Ведь у вас идет сравнение текущего символа только с предыдущим?
Нет.
Я так понял задание - выяснить, имеются ли в числе одинаковые цифры, стоящие рядом.
Если нужно выяснить, если ли одинаковые цифры в числе вообще - для этой цели очень хорошо подходит map =)
Сыроежка
Заблокирован
11.08.2011, 15:46     Задача:Определить повторяются Цифры в Числе или нет... #25
Цитата Сообщение от diagon Посмотреть сообщение
Нет.
Я так понял задание - выяснить, имеются ли в числе одинаковые цифры, стоящие рядом.
Если нужно выяснить, если ли одинаковые цифры в числе вообще - для этой цели очень хорошо подходит map =)
В вашем решении существует еще одна проблема: оно не имеет дело именно с числом. Вы рассматриваете любые символы. А если пользователь вообще ничего не ввел, то в вашем решении имеется серьезная ошибка.
diagon
Higher
 Аватар для diagon
1920 / 1186 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
11.08.2011, 15:50     Задача:Определить повторяются Цифры в Числе или нет... #26
Цитата Сообщение от Сыроежка Посмотреть сообщение
В вашем решении существует еще одна проблема: оно не имеет дело именно с числом. Вы рассматриваете любые символы. А если пользователь вообще ничего не ввел, то в вашем решении имеется серьезная ошибка.
Проблема есть, но другая.
Пользователь не сможет ничего не ввести, ибо для окончания ввода нужно ввести EOF =)
Такова цена инициализации стринга итераторами...
Dani
1263 / 621 / 50
Регистрация: 11.08.2011
Сообщений: 2,236
Записей в блоге: 2
Завершенные тесты: 1
11.08.2011, 15:53     Задача:Определить повторяются Цифры в Числе или нет... #27
Цитата Сообщение от Сыроежка Посмотреть сообщение
В вашем решении существует еще одна проблема: оно не имеет дело именно с числом. Вы рассматриваете любые символы. А если пользователь вообще ничего не ввел, то в вашем решении имеется серьезная ошибка.
Цитата Сообщение от Vepsar Посмотреть сообщение
Нужно ввести число
Поэтому не может быть ничего
Сыроежка
Заблокирован
11.08.2011, 16:25     Задача:Определить повторяются Цифры в Числе или нет... #28
Цитата Сообщение от diagon Посмотреть сообщение
Проблема есть, но другая.
Пользователь не сможет ничего не ввести, ибо для окончания ввода нужно ввести EOF =)
Такова цена инициализации стринга итераторами...
Я не понял вашу фразу о "цене инициализации строк", но разве пользователь не может сразу же ввести EOF, и у вас получится пустая строка, итератор для которой вы в алгоритме std::for_each увеличиваете на 1?
diagon
Higher
 Аватар для diagon
1920 / 1186 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
11.08.2011, 16:36     Задача:Определить повторяются Цифры в Числе или нет... #29
Цитата Сообщение от Сыроежка Посмотреть сообщение
Я не понял вашу фразу о "цене инициализации строк", но разве пользователь не может сразу же ввести EOF, и у вас получится пустая строка, итератор для которой вы в алгоритме std::for_each увеличиваете на 1?
Ну просто я объявление и инициализацию стринги в 1 строчке сделал.
Может, конечно....
Вот только зачем ему это? =)
Достаточно всего-лишь считать строку с помощью >> и никаких проблем не будет. Но это выглядит менее загадочно, поэтому я отбросил этот вариант =)
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9373 / 5423 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
11.08.2011, 16:49     Задача:Определить повторяются Цифры в Числе или нет... #30
Цитата Сообщение от Сыроежка Посмотреть сообщение
usr::digital_iterator
А реализация этого чуда будет, не?

До кучи ещё вариант:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <stdio.h>
#include <stdlib.h>
    
int have_same_digits(unsigned x){
    unsigned digit = x % 10, number = x;
    
    if ( number < 10 )
        return 0;
    while ( number /= 10 )
        if ( number % 10 == digit )
            return 1;
    
    return have_same_digits(x / 10);
}
 
int main(void){
    int num;
    
    while ( printf("Number: ") && scanf("%d", &num) == 1 )
        printf("Number %d %shave same digits.\n", num, ( have_same_digits(abs(num)) ) ? "" : "don't ");
    
    exit(0);
}
diagon
Higher
 Аватар для diagon
1920 / 1186 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
11.08.2011, 17:01     Задача:Определить повторяются Цифры в Числе или нет... #31
На си можно еще так.
C
1
2
3
4
5
6
7
8
9
10
11
12
#include <stdio.h>
bool same_digits_exists( long n){
    for (int digits[10] = {}; n ; n /= 10)
        if (++digits[n % 10] > 1)
            return true;
        return false;
}
int main(){
    long x;
    scanf("%ld", &x);
    printf("%s", same_digits_exists(x) ? "Yes\n" : "No\n");
}
PointsEqual
ниначмуроФ
 Аватар для PointsEqual
832 / 516 / 33
Регистрация: 12.10.2009
Сообщений: 1,915
11.08.2011, 17:05     Задача:Определить повторяются Цифры в Числе или нет... #32
Цитата Сообщение от diagon Посмотреть сообщение
for (int digits[10] =
в си разве так можно?
co6ak
Кошковед
 Аватар для co6ak
403 / 496 / 29
Регистрация: 12.04.2010
Сообщений: 1,392
11.08.2011, 17:05     Задача:Определить повторяются Цифры в Числе или нет... #33
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от diagon Посмотреть сообщение
Ну просто я объявление и инициализацию стринги в 1 строчке сделал.
Может, конечно....
Вот только зачем ему это? =)
Достаточно всего-лишь считать строку с помощью >> и никаких проблем не будет. Но это выглядит менее загадочно, поэтому я отбросил этот вариант =)
вы недооцениваете потенциальный идиотизм пользователя.

я лично видел секретутку, когда проходил практику, которая при появлении в программе фразы "Нажмите любую кнопку что бы продолжить", нажимала ресет на системнике...
diagon
Higher
 Аватар для diagon
1920 / 1186 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
11.08.2011, 17:07     Задача:Определить повторяются Цифры в Числе или нет... #34
Цитата Сообщение от PointsEqual Посмотреть сообщение
в с разве так можно?
В си и bool нет в общем-то... =)
Но gcc хавает и ладно.
Пруф.
Код
diagon@shadeware:~$ cat test.cpp && gcc test.cpp -Wall
#include <stdio.h>
bool same_digits_exists( long n){
	for (int digits[10] = {}; n ; n /= 10)
		if (++digits[n % 10] > 1)
			return true;
		return false;
}
int main(){
	long x;
	scanf("%ld", &x);
	printf("%s", same_digits_exists(x) ? "Yes\n" : "No\n");
}
diagon@shadeware:~$

co6ak, убило xD
Сыроежка
Заблокирован
11.08.2011, 17:56     Задача:Определить повторяются Цифры в Числе или нет... #35
Цитата Сообщение от PointsEqual Посмотреть сообщение
в си разве так можно?
В С99 так можно. Другое дело, что в С нельзя инициализировать объекты пустым списком, то есть такая инициализация

C++
1
int digits[10] = {};
в С недопустима. Нужно было поместить 0 внутрь фигурных скобок. Что касается true и false, то если включить соответсвующий заголовок <stdbool.h>, то эти символические имена можно использовать в С, так как они просто являются символическими именами целочисленных значенирй 1 и 0. А bool это максро, которое расширяется в _Bool.

Добавлено через 11 минут
Цитата Сообщение от Olga_ Посмотреть сообщение
А так еще более экономно и интересно

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
long Check(long x)
{
   long y;
   int flag[10] = {0};
   y = abs(x);
   while (y && ++flag[y % 10] < 2)
      y /= 10;
   return (y != 0);
}
 
int main()
{
   long x;
   scanf("%d", &x);
   printf("%s\n", Check(x) ? "povt" : "ne povt");
   getchar();
   return 0;
}
Я вас разочарую, но ваш алгоритм не работает! Более того, он может привести к аварийному завершению программы.

Попробуйте передать ему в качестве значения LONG_MIN.
Olga_
 Аватар для Olga_
840 / 182 / 16
Регистрация: 01.08.2011
Сообщений: 502
11.08.2011, 18:25     Задача:Определить повторяются Цифры в Числе или нет... #36
Цитата Сообщение от Сыроежка Посмотреть сообщение

Я вас разочарую, но ваш алгоритм не работает! Более того, он может привести к аварийному завершению программы.

Попробуйте передать ему в качестве значения LONG_MIN.
Умник какой, все прекрасно работает от LONG_MIN+1 до LONG_MAX.
Сыроежка
Заблокирован
11.08.2011, 18:39     Задача:Определить повторяются Цифры в Числе или нет... #37
Цитата Сообщение от Olga_ Посмотреть сообщение
Умник какой, все прекрасно работает от LONG_MIN+1 до LONG_MAX.
Забавно! Это просто вам повезло, что у вас аварийно не завершается программа. Так как выражение y % 10 является отрицательным числом, и вы обращаетесь к своему массивы flag с отрицательным индексом, то есть выходите за границу начала вашего массива.

Чтобы было понятно, я вам представлю упрощенный фрагмент вашего алгоритма

C++
1
2
3
4
5
6
7
8
9
10
void f( long x )
{
   long y = std::abs( x );
 
   do
   {
      std::cout << y % 10 << std::endl;
      y /= y;
   } while ( y );
}
И передайте в эту функцию LONG_MIN.

Кстати сказать, а что делать, если задачу нужно решить для целочисленного типа __int64? Переписывать функцию?
Olga_
 Аватар для Olga_
840 / 182 / 16
Регистрация: 01.08.2011
Сообщений: 502
11.08.2011, 18:44     Задача:Определить повторяются Цифры в Числе или нет... #38
Цитата Сообщение от Сыроежка Посмотреть сообщение
Забавно! Это просто вам повезло, что у вас аварийно не завершается программа. Так как выражение y % 10 является отрицательным числом, и вы обращаетесь к своему массивы flag с отрицательным индексом, то есть выходите за границу начала вашего массива.

Чтобы было понятно, я вам представлю упрощенный фрагмент вашего алгоритма

C++
1
2
3
4
5
6
7
8
9
10
void f( long x )
{
   long y = std::abs( x );
 
   do
   {
      std::cout << y % 10 << std::endl;
      y /= y;
   } while ( y );
}
И передайте в эту функцию LONG_MIN.
Сыроежка, во первых, все работает, а во вторых, это просто красивый алгоритм, ну нельзя же быть таким дотошным. Да, видно, сразу, вы умный человек, но алгоритм это как красота мысли, его легко переделать, если надо. Еще раз повторю, у меня все работает
Сыроежка
Заблокирован
11.08.2011, 18:50     Задача:Определить повторяются Цифры в Числе или нет... #39
Красота мысли - это как раз когда видешь, что алгоритм корректный и универсальный! А когда начинаешь "спотыкаться", то это не представляется красотой.

Красота мысли - это как раз предложенный мной входной итератор, который корректно работает для любого целочисленного типа, и может быть использован с любым стандартным алгоритмом, который принимает входной итератор.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.08.2011, 18:51     Задача:Определить повторяются Цифры в Числе или нет...
Еще ссылки по теме:

Выдать в возрастающем порядке все цифры от 100 до 999 в десятичном записи в которых нет одинаковых числе C++
C++ Верно ли, что в данном числе нет данной цифры Н
Определить есть ли равные цифры в числе C++

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

Или воспользуйтесь поиском по форуму:
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9373 / 5423 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
11.08.2011, 18:51     Задача:Определить повторяются Цифры в Числе или нет... #40
C++
1
unsigned long y = abs(x);
решит проблему. За то алгоритм простой и ясный. Мне вот репу почесать пришлось, чтобы что-то непохожее придумать...
Цитата Сообщение от Сыроежка Посмотреть сообщение
y /= y;
А это что вообще? В оригинале такого небыло...
Yandex
Объявления
11.08.2011, 18:51     Задача:Определить повторяются Цифры в Числе или нет...
Ответ Создать тему
Опции темы

Текущее время: 23:03. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru