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

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

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 27.09.2013, 01:36   #1
satanael
Новичок
Джуниор
 
Регистрация: 27.09.2013
Сообщений: 1
По умолчанию Напечатать все возможные двузначные числа из трехзначного

Дано трехзначное число (ввести самому).
Напечатать все возможные двузначные числа, составленные из цифр этого трехзначного числа.

Будьте добры, помогите)

получается у меня что то типа того, правильно ли?

Код:
a:=n div 100;
b:=n div 10 mod 10;
c:=n mod 10;
writeln(a,b,c);
writeln(a,c,b);

Последний раз редактировалось Stilet; 27.09.2013 в 09:53.
satanael вне форума Ответить с цитированием
Старый 27.09.2013, 07:54   #2
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Код:
writeln(a, b);
writeln(b, a);
writeln(a, c);
writeln(c, a);
writeln(b, c);
writeln(c, b);
Еще можно написать чуть по-другому, чтобы выводились только разные двухзначные числа.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )

Последний раз редактировалось BDA; 27.09.2013 в 07:58.
BDA вне форума Ответить с цитированием
Старый 27.09.2013, 08:42   #3
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от BDA
Код:
writeln(a, b);
...
writeln(c, b);
Еще можно написать чуть по-другому, чтобы выводились только разные двухзначные числа.
справедливости ради надо отметить, что предложенный код не обязательно будет выводить ДВУХЗНАЧНЫЕ числа!
не проверяются нулевые цифры.

можно, например, так:
Код:
if a<>0 then writeln(a, b);
if b<>0 then writeln(b, a);
if a<>0 then writeln(a, c);
if c<>0 then writeln(c, a);
if b<>0 then writeln(b, c);
if c<>0 then writeln(c, b);
или даже так:
Код:
if a<>0 then begin
   writeln(a, b);
   writeln(a, c);
end;
if b<>0 then begin
   writeln(b, a);
   writeln(b, c);
end;
if c<>0 then begin
   writeln(c, a);
   writeln(c, b);
end;
Примечание. Разумеется, не учитывается факт возможного повтора чисел!
Если нужно, чтобы выводились только РАЗЛИЧНЫЕ двухзначные числа, то код надо дополнять/менять!


p.s. в данном случае спасает только то, что вариантов перестановок всего 6 (по 2 из 3-х). Если задачу чуть расширить, то сразу придётся привлекать комбинаторные алгоритмы!
Serge_Bliznykov вне форума Ответить с цитированием
Старый 27.09.2013, 09:14   #4
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Serge_Bliznykov, согласен.
Чтобы убить 2 зайцев (повторы и однозначные числа) в данном случае можно использовать множества:
Код:
var
  v: set of byte;
  n: integer;
  a, b, c, i: byte;
begin
  readln(n);
  a := n div 100; 
  b := n div 10 mod 10; 
  c := n mod 10;
  v := [10 * a + b, 10 * b + a, 10 * a + c, 10 * c + a, 10 * b + c, 10 * c + b];
  for i := 10 to 99 do
    if i in v then
      writeln(i);
end.
Хотя цикл смущает - из пушки по воробьям.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 27.09.2013, 09:34   #5
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

BDA, красиво!!! Жаль плюсануть движок форума не даёт..

Я бы не догадался использовать множества в данном случае.

а цикл - меня лично совсем не смущает!
тут уж, если использовать множества, то получаешь полностью и все преимущества (соблюдение уникальности), но и недостатки (вывод элементов множества). Насколько мне известно, в Паскаль нельзя получить содержимое множества способом отличным от полного перебора всех элементов и проверкой каждого на вхождение в данное множество.. се ля ви..
Serge_Bliznykov вне форума Ответить с цитированием
Старый 27.09.2013, 21:44   #6
Poma][a
Новичок
Джуниор
 
Регистрация: 11.10.2011
Сообщений: 3,882
По умолчанию

Цитата:
Насколько мне известно, в Паскаль нельзя получить содержимое множества способом отличным от полного перебора всех элементов и проверкой каждого на вхождение в данное множество..
Если очень хочется гемороя, то можно копаться в ABC.. :
Цитата:
Print(delim)- процедура, выводящая содержимое множества в окно вывода; элементы при выводе разделяются строкой delim
Цитата:
в Паскаль нельзя получить содержимое множества способом отличным от полного перебора всех элементов
Опять же стоит делать оговорку, что мы говорим не про массив флагов, а про set of ..
Poma][a вне форума Ответить с цитированием
Старый 27.09.2013, 22:32   #7
Poma][a
Новичок
Джуниор
 
Регистрация: 11.10.2011
Сообщений: 3,882
По умолчанию

А так?
Код:
var
	s : set of byte;
	a : array [1..32] of byte;
	i, j : Integer;
begin
	s := [1, 2, 4, 100, 255, 3];

	Move (s, a, 32);

	for i := 1 to 32 do
		for j := 1 to 8 do begin
			if a[i] and 1 = 1 then
				WriteLn ((i-1)*8+j-1);
			a[i] := a[i] shr 1
		end
				
end.
Poma][a вне форума Ответить с цитированием
Старый 27.09.2013, 23:00   #8
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Poma][a, ага, получается быстрее, чем in.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 27.09.2013, 23:05   #9
Poma][a
Новичок
Джуниор
 
Регистрация: 11.10.2011
Сообщений: 3,882
По умолчанию

Цитата:
Poma][a, ага, получается быстрее, чем in.
А Вы это Вы времечко засекали? Если да, то можно код?
Poma][a вне форума Ответить с цитированием
Старый 27.09.2013, 23:27   #10
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Цитата:
Сообщение от Poma][a Посмотреть сообщение
Если да, то можно код?
Эх, так и знал, что нужно было сохранить его
Код:
procedure writeln(i: integer); overload;
begin
end;

procedure writeln(i: byte); overload;
begin
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  s: set of byte;
  a: array [1 .. 32] of byte;
  i, j, c: integer;
  str: string;
  z: byte;
  st, en: int64;
begin
  s := [1, 2, 4, 100, 255, 3];

  st := gettickcount();
  for c := 0 to 1000000 do
  begin
    Move(s, a, 32);
    for i := 1 to 32 do
      for j := 1 to 8 do
      begin
        if a[i] and 1 = 1 then
          writeln((i - 1) * 8 + j - 1);
        a[i] := a[i] shr 1
      end;
  end;
  en := gettickcount();

  str := inttostr(en - st);

  st := gettickcount();
  for c := 0 to 1000000 do
    for z := 0 to 255 do
      if z in s then
        writeln(z);
  en := gettickcount();

  str := str + ' ' + inttostr(en - st);

  Caption := str;
end;
Перенабрал
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
найти все двузначные числа.. nikki793 C# (си шарп) 3 26.11.2012 09:55
Напечатать все натуральные числа. МНОЖЕСТВА ))) Viwwna Паскаль, Turbo Pascal, PascalABC.NET 5 19.11.2011 15:25
все возможные числа nick_5714 Помощь студентам 7 16.02.2011 15:41
определить все двузначные числа сумма квадратов цифр которых кратна числу 15 [Pascal] mrRastom Помощь студентам 5 16.12.2010 09:47
Напечатать все числа Пифагора меньше N Санячос Помощь студентам 5 18.01.2008 18:21