Как найти две одинаковые цифры

88 / 84 / 31

Регистрация: 18.11.2013

Сообщений: 390

1

18.11.2013, 19:42. Показов 11103. Ответов 6


Студворк — интернет-сервис помощи студентам

Итак, наткнулся недавно на такую хитрую, на первый взгляд лёгкую ззадачу, но, попробывав её решить, начал очень сильно напрягаться.
Сейчас же почти сделал эту программу и хочу поделится(ну и попросить её доделать)этой задачей
Итак: Необходимо написать программу, на ввод которая получает число, а на выводе отвечает, есть ли в этом числе 2 одинаковые цифры, или нет
Как говорю, задача очень хитрая и над ней нужно сильно подумать, кому нужно могу отправить то что я смог сделать, пишите в скайп: Krock21rus
P.s. Задача для 8 класса



0



Байт

Диссидент

Эксперт C

27488 / 17175 / 3784

Регистрация: 24.12.2010

Сообщений: 38,685

18.11.2013, 20:24

2

Лучший ответ Сообщение было отмечено Памирыч как решение

Решение

C
1
2
3
4
5
6
7
8
9
10
int cnt[10];
for(i=0; i<10; i++) cnt[i] = 0;
while (N) {
   cnt[N%10] ++;
   N /= 10;
}
for(i=0; i<10;i++) {
   if (cnt[i] > 1) { printf("Yes!!!"); break; }
}
if (i==10) printf("No!!!");



0



easybudda

Модератор

Эксперт PythonЭксперт JavaЭксперт CЭксперт С++

11885 / 7258 / 1720

Регистрация: 25.07.2009

Сообщений: 13,276

19.11.2013, 01:09

3

Лучший ответ Сообщение было отмечено Памирыч как решение

Решение

Krock21rus, тут эту «хитрую» задачу уже как только не решали.

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
#include <stdio.h>
 
int have_same_digits(unsigned n) {
    if ( n > 9 ) {
        unsigned last = n % 10;
        unsigned left = n / 10;
        
        while ( left ) {
            if ( last == ( left % 10 ) )
                return 1;
            left /= 10;
        }
        
        return have_same_digits(n / 10);
    }
    else
        return 0;
}
 
int main(void) {
    unsigned n;
    
    while ( printf("Number: ") && scanf("%u", &n) == 1 )
        printf("%sn", ( have_same_digits(n) ) ? "YES" : "NO");
    
    return 0;
}

Если нужно узнать, есть ли именно две одинаковых цифры, в коде Байт восьмая строка

C
1
 if (cnt[i] == 2) { printf("Yes!!!"); break; }



0



Thinker

Эксперт С++

4265 / 2239 / 203

Регистрация: 26.08.2011

Сообщений: 3,802

Записей в блоге: 5

19.11.2013, 13:04

4

C
1
2
3
4
5
6
7
int Check(unsigned a)
{
    int count[10] = {0};
    for(; a && ++count[a % 10] < 2; a /= 10)
        ;
    return a;
}



1



Диссидент

Эксперт C

27488 / 17175 / 3784

Регистрация: 24.12.2010

Сообщений: 38,685

19.11.2013, 13:43

5

Thinker, Класс! Короче уже кажется нельзя.



1



Ryuk

183 / 182 / 56

Регистрация: 10.06.2011

Сообщений: 871

19.11.2013, 18:02

6

Thinker, что-то я не догнал по поводу

C
1
++count[a % 10] < 2

, не могли бы разъяснить? И как будет выполняться цикл

C
1
2
3
4
while(N)
{ 
/*...*/ 
}

Пока переменная не <= нулю или до каких пор выполняется цикл?



0



Байт

Диссидент

Эксперт C

27488 / 17175 / 3784

Регистрация: 24.12.2010

Сообщений: 38,685

19.11.2013, 19:18

7

Цитата
Сообщение от Ryuk
Посмотреть сообщение

<= нулю

C++
1
N!=0

А вообще если есть вопросы по поводу этого замечательного кода, возьмите в зубы отладчик и аккуратненько по циклу пройдитесь
Я вот его «в уме» прокрутил…

Добавлено через 49 секунд
получил большое эстетическое удовольствие…



1



You can do it with by casting the int in list of strings representing each digits and add the number of duplicate elements:

def two_identical(start, finish):
    counter=0
    for i in range(start+1,finish,1):
        #Convert the digit in list of str. e.g 100 => ['1','0','0']
        i=[digit for digit in str(i)]
        #add the len of set of duplicate =>
        #e.g.: ['4', '9', '9', '7', '7'] => {'9','7'} => counter +=2
        #e.g.: ['4', '9', '9', '9', '7'] => {'9'} => counter +=1
        #e.g.:['4', '9', '9', '9', '4'] => {'9','4'} => counter +=2
        counter+=len(set([x for x in i if i.count(x) >1]))

    print(f"counter ({start},{finish}):{counter}")
    return counter

try:
    assert two_identical(20, 33) == 1
    assert two_identical(0, 10) == 0
    assert two_identical(0, 101) == 10
    assert two_identical(0, 1000) == 261
    assert two_identical(5000, 50000) == 35198
except AssertionError:
    print("TEST ERROR")
    #traceback.print_exc()
else:
    print("TEST PASSED")

result:

counter (20,33):1
counter (0,10):0
counter (0,101):10
counter (0,1000):261
counter (5000,50000):35198
TEST PASSED

Формулировка задачи:

Итак, наткнулся недавно на такую хитрую, на первый взгляд лёгкую ззадачу, но, попробывав её решить, начал очень сильно напрягаться.
Сейчас же почти сделал эту программу и хочу поделится(ну и попросить её доделать)этой задачей
Итак: Необходимо написать программу, на ввод которая получает число, а на выводе отвечает, есть ли в этом числе 2 одинаковые цифры, или нет
Как говорю, задача очень хитрая и над ней нужно сильно подумать, кому нужно могу отправить то что я смог сделать, пишите в скайп: Krock21rus
P.s. Задача для 8 класса

Код к задаче: «Определить, есть ли в числе 2 одинаковые цифры»

textual

#include <stdio.h>
 
int have_same_digits(unsigned n) {
    if ( n > 9 ) {
        unsigned last = n % 10;
        unsigned left = n / 10;
        
        while ( left ) {
            if ( last == ( left % 10 ) )
                return 1;
            left /= 10;
        }
        
        return have_same_digits(n / 10);
    }
    else
        return 0;
}
 
int main(void) {
    unsigned n;
    
    while ( printf("Number: ") && scanf("%u", &n) == 1 )
        printf("%sn", ( have_same_digits(n) ) ? "YES" : "NO");
    
    return 0;
}

Полезно ли:

11   голосов , оценка 4.182 из 5

Дан массив с числами. Проверьте, есть ли в нём два одинаковых числа подряд.
Если есть — выведите ‘да’, а если нет — выведите ‘нет’

Моё решение такое:

var arr = [3, 1, 1, 12];
for (var i = 0; i > arr.length; i++) {
  for (var j = i + 1; j > arr.length; j++) {
    if (arr[i] === arr[j]) {
      alert('yes')
    } else {
      alert('no')
    }
  }

Но ничего не выводит alert. В чём проблема?

Bharatha's user avatar

Bharatha

5,2561 золотой знак18 серебряных знаков36 бронзовых знаков

задан 6 июн 2018 в 9:09

Keeps Keeps's user avatar

1

Проблема в том, что ты делаешь вывод для каждого числа в массиве. В случае нахождения подходящей пары надо прекращать проверку. А для неподходящих пар вообще ничего делать не надо.

function check(a) {
  for (var q=1; q<a.length; ++q) {
    if (a[q] === a[q-1]) {
      return true;
    }
  }
  
  return false;
}

console.log(check([3, 1, 1, 12]) ? "Да" : "Нет");

ответ дан 6 июн 2018 в 9:26

Qwertiy's user avatar

QwertiyQwertiy

121k24 золотых знака121 серебряный знак291 бронзовый знак

[3, 1, 1, 12].reduce((a, b) => (typeof a === 'number' && typeof b === 'number' && a === b ? console.info('Yes') : null, b), null);

ответ дан 6 июн 2018 в 9:15

3

Можно воспользоваться функцией Array.prototype.some

// Дословно:
// Существует ли элемент(не являющийся первым) равный предыдущему?
const hasSeqEq = arr => arr.some((el, i, arr) => i!=0 && el===arr[i-1]);

console.log(hasSeqEq([5, 1, 5, 2])); // false
console.log(hasSeqEq([5, 1, 5, 2, 2, 7])); // true

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


ES5:

// Дословно:
// Существует ли элемент(не являющийся первым) равный предыдущему?
function hasSeqEq(arr) {
  return arr.some(function(el, i, arr) {
    return i != 0 && el === arr[i - 1];
  });
}

console.log(hasSeqEq([5, 1, 5, 2])); // false
console.log(hasSeqEq([5, 1, 5, 2, 2, 7])); // true

ответ дан 6 июн 2018 в 9:32

vp_arth's user avatar

vp_arthvp_arth

27.1k2 золотых знака45 серебряных знаков76 бронзовых знаков

11

function f(arr) {
    for (let i = 0; i < arr.length; i++) {
        if (arr.indexOf(arr[i]) !== arr.lastIndexOf(arr[i])) {
            return true
        }
    }
    return false
}
let arr = [1, 2, 3, 4, 5, 6, 4, 8];
console.log(f(arr))

ответ дан 17 ноя 2020 в 18:47

Krovorgen's user avatar

KrovorgenKrovorgen

7684 серебряных знака16 бронзовых знаков

Проблема в том, что вы написали неправильное условие выхода из цикла.
i > arr.length — возвращает false на первой же проверке и цикл заканчивается не сделав ни одной итерации.

var arr = [3, 1, 1, 12]; 

for (var i = 0; i < arr.length; i++){
    for (var j = i + 1; j < arr.length; j++){
        if (arr[i] === arr[j]){
            alert('yes')
        } else {
            alert('no');
        }
    }
}

ответ дан 6 июн 2018 в 9:12

Darth's user avatar

DarthDarth

13k2 золотых знака25 серебряных знаков56 бронзовых знаков

Сергей и Игорь изучают четырёхзначные числа, первая цифра которых 9 (т.е. числа вида $overline{9abc}$). Они хотят выписать все четырёхзначные числа, у которых есть ровно две одинаковые цифры. Помогите им определить, сколько таких чисел.

Источник задачи:

http://www.uni.bsu.by/arrangements/imct … _baz69.pdf

(задача №2 для 6-го класса).

У меня такое ощущение, что автор задачи пытается своим условием «запутать врага». С одной стороны, в первом предложении условия говорится о числах, начинающихся на 9, а с другой, во втором предложении речь идёт обо всех четырёхзначных числах.

Если речь только о числах, начинающихся с девятки, то мне кажется, что ответ будет 432, поскольку всего возможно только 6 случаев: $overline{99ab},; overline{9a9b},; overline{9ab9},; overline{9aab},; overline{9aba},; overline{9baa};$, где $a, b$ — различные цифры, не равные 9. В каждом из этих 6 случаев будет по 72 варианта, итого 432.

У меня правильно или что-то упущено?

P. S. А если всё-таки не только начинающиеся с девятки посчитать, будет $432cdot 9=3888$, да? Ведь если девятку заменить любой другой ненулевой цифрой, суть задачи не изменится, правда?

Понравилась статья? Поделить с друзьями:
  • Conan exiles руда звездного металла как найти
  • Формула кулона физика как найти q1
  • Как составить план производства продукции в бизнес плане
  • Stranded deep как найти деталь автожира
  • Как найти улицу дружинников в воронеже