Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 21.03.2016, 12:16   #11
Dvoishnik
Форумчанин
 
Регистрация: 12.02.2011
Сообщений: 808
По умолчанию

данный алгоритм можно сократить, все числа до 123 двояки.
Терпение!Дежурный экстрасенс скоро свяжется с вами!
Dvoishnik вне форума Ответить с цитированием
Старый 21.03.2016, 13:11   #12
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
данный алгоритм можно сократить, все числа до 123 двояки.
нет, все числа до 101.

например, число 102 уже использует три цифры.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 21.03.2016, 13:23   #13
Dvoishnik
Форумчанин
 
Регистрация: 12.02.2011
Сообщений: 808
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
нет, все числа до 101.

например, число 102 уже использует три цифры.
каюсь, был не прав.
Терпение!Дежурный экстрасенс скоро свяжется с вами!
Dvoishnik вне форума Ответить с цитированием
Старый 21.03.2016, 13:53   #14
Naive
Раздолбайских Дел
Старожил
 
Аватар для Naive
 
Регистрация: 22.05.2009
Сообщений: 3,828
По умолчанию

JavaScript няшка:
Код:
function dubl( num ){
    return (num+'').
        replace(/(\d)(?=.*?\1)/g,'').length <= 2
}
Alar, верни репу!
Naive вне форума Ответить с цитированием
Старый 21.03.2016, 20:37   #15
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Задачка заинтересовала. Вот что получилось:
Код:
function min_n(Num: Integer; k: Integer): Integer;
var
  j, tmp: Integer;
begin
  j := 10;
  while Num > 0 do
  begin
    tmp := Num mod 10;
    if (tmp < j) and (tmp >= k) then
      j := tmp;
    Num := Num div 10;
  end;
  result := j;
end;

function next_binum(Num: Integer): Integer;
var
  n, k, j: Integer;
begin
  k := 1;
  while not is_binum(Num) do
  begin
    n := Num mod (10 * k) div k;
    j := min_n(Num div (10 * k), n);
    if n <> j then
    begin
      Num := (Num div (10 * k)) * 10 * k + j * k;
      k := 1;
    end
    else
      k := 10 * k;
  end;
  result := Num;
end;
Немножко погонял и посравнивал ответы с итеративным способом - совпало. Но эта функция ищет только ближайшее наибольшее двоякое (а если вызвать функцию для двоякого числа, то вернет его самого).
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )

Последний раз редактировалось BDA; 21.03.2016 в 20:42.
BDA на форуме Ответить с цитированием
Старый 21.03.2016, 21:52   #16
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Ну тогда ближайшее меньшее двоякое так предложу. Почти без циклов, но через строку
Код:
function prmior_binu(Num: Integer): Integer;
var s: String;
    n1,n2: Integer;
begin
  if Num<=101 then begin
    Result:=Num-1;
    Exit;
  end;
  s:=IntToStr(Num);
  if s[1]<>s[2] then begin
    n1:=StrToInt(Copy(s,1,2)+StringOfChar(s[1],Length(s)-2));
    n2:=StrToInt(Copy(s,1,2)+StringOfChar(s[2],Length(s)-2));
    if (n1<Num) and (n2<Num) then Result:=Max(n1,n2)
    else if n1<Num then Result:=n1
    else if n2<Num then Result:=n2
    else begin
      if Copy(s,1,2)='10' then Result:=StrToInt(StringOfChar('9',Length(s)-1))
      else if s[2]='0' then Result:=StrToInt(Chr(Ord(s[1])-1)+StringOfChar('9',Length(s)-1))
      else begin
         s[2]:=Chr(Ord(s[2])-1);
         if s[1]=s[2] then Result:=StrToInt(Copy(s,1,2)+StringOfChar('9',Length(s)-2))
         else Result:=Max(StrToInt(Copy(s,1,2)+StringOfChar(s[1],Length(s)-2)),
                          StrToInt(Copy(s,1,2)+StringOfChar(s[2],Length(s)-2)));
      end;
    end;
  end
  else begin
    for n1:=StrToInt(s[3]) downto 0 do begin
      n2:=StrToInt(Copy(s,1,2)+StringOfChar(IntToStr(n1)[1],Length(s)-2));
      if n2<Num then begin Result:=n2; Exit; end;
    end;
    s[2]:=Chr(Ord(s[2])-1);
    Result:=Max(StrToInt(Copy(s,1,2)+StringOfChar(s[1],Length(s)-2)),
                StrToInt(Copy(s,1,2)+StringOfChar(s[2],Length(s)-2)));
  end;
end;
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 21.03.2016 в 21:55.
Аватар вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Задано натуральное число N. Найти наименьшее и наибольшее число, состоящее из тех же цифр и в таком же количестве, что и N dimon_snake Паскаль, Turbo Pascal, PascalABC.NET 9 17.11.2015 23:38
Даны вещественное число a и натуральное число n. Вычислить S Dimaska931 Паскаль, Turbo Pascal, PascalABC.NET 6 28.11.2012 12:09
Даны действительное число a, натуральное число n. Вычис- лить: Petrovich83 Помощь студентам 1 09.04.2011 11:30
даны действительное число а, натуральное число n [Паскаль] Анна22 Помощь студентам 2 07.12.2010 20:31
Натуральное число, в записи которого п цифр, называется числом Армстронга, если сумма его цифр, возведенн OTLi4HO Общие вопросы C/C++ 6 14.01.2009 19:48