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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 29.10.2011, 21:30   #1
kidi911
 
Регистрация: 29.10.2011
Сообщений: 9
По умолчанию Цифры

Может подобная задача уже и была,но все-же прошу помочь.
Условие:Дано натуральное число N.Найти наименьшее и найбольшее число,которое складается с тех самых цифр и в том же количестве что и и число N.
Пример: Входящие: 7051
Выходящие:1057 7510
kidi911 вне форума Ответить с цитированием
Старый 29.10.2011, 22:02   #2
val_nnm
Форумчанин
 
Регистрация: 18.10.2009
Сообщений: 185
По умолчанию

1) Ваш пример несоответсвует текстовому описнию. Т.к. минимальное число из цифр 7051 это 0157 (возможно в текстовом описании нужно сказать про число неможет начинаться с нулей)

2) Для нахождения максимального числа просто отсортируйте числа в убывающем порядке. Для нахождения минимального числа отсортируйте в возрастающем порядке. (если добавить ограничение на 0 в начале числа. В отсортированном масиве нужно нужно найти первый ненулевой элемент и поменять его с первой цифрой (нулём) местами. )
На С# пишу лучше чем на русском.
"У меня правильнописание хромает. Оно хорошее, но почему-то хромает."
val_nnm вне форума Ответить с цитированием
Старый 29.10.2011, 22:25   #3
kidi911
 
Регистрация: 29.10.2011
Сообщений: 9
По умолчанию

В условии не сказано про 0,но видно,что они это имели в ввиду,что не с нуля начинается.Если не тяжело,напишите тогда с условием,что с нуля не начинается.Пока нету ответа буду сам пытаться чтото делать
kidi911 вне форума Ответить с цитированием
Старый 30.10.2011, 00:47   #4
val_nnm
Форумчанин
 
Регистрация: 18.10.2009
Сообщений: 185
По умолчанию

Давайте сделаем так. Чтобы небыло полной халявы (которую я неприветсвую). Либо приведите свои наработки. Либо хотябы найдите и приведите какойнибуть алгоритм сортировки (на этом форуме и в интернете таких примеров можно найти тысячи) И тогда я вам помогу его адаптировать к вашему заданию.

И ещё вам нужна проверка коррексности ввода числа? (проще без проверки сделать)
На С# пишу лучше чем на русском.
"У меня правильнописание хромает. Оно хорошее, но почему-то хромает."
val_nnm вне форума Ответить с цитированием
Старый 30.10.2011, 11:02   #5
kidi911
 
Регистрация: 29.10.2011
Сообщений: 9
По умолчанию

Сейчас по памяти сортировку напишу пузырями.
Код:
type mas=array[1..100]of integer;
var buf,n,i:integer;a:mas;
begin
i:=2 to n do 
if a[i]<a[i+1] then begin 
buf:a[i];
a[i]:=a[i+1];
a[i+1]:=buf;
end;end.
А вот розбитие на цифры:
Код:
write('X=');
readln(x);
a:=x div 1000; // 1ая цифра
b:=(x mod 1000) div 100; // 2ая цифра
c:=(x mod 100) div 10; // 3ья цифра
d:=x mod 10; // 4ая цифра
Исправьте,Чтобы оно находило мин и макс число,только чтобы с нуля не начиналось и как дальше разбивать число,если например 1234567 ввести?

Последний раз редактировалось kidi911; 30.10.2011 в 12:03.
kidi911 вне форума Ответить с цитированием
Старый 30.10.2011, 12:51   #6
val_nnm
Форумчанин
 
Регистрация: 18.10.2009
Сообщений: 185
По умолчанию

Вот код
Код:
const maxN = 10;
Type mas = array[1..maxN] of byte;
var a:mas;
    temp:byte;
    n,i:integer;
    t:boolean;
    x,max,min:longint;
begin
  write('X=');
  readln(x);
  n := 0;
  repeat
    n := n+1;
    a[n] := x mod 10;
    x := x div 10;
  until (x=0);

{ Это код переворота массива в обратном направлении (но тут он ненужен т.к.
  всёравно он потом будет сортироваться. т.е. порядок неважен)
  for i := 1 to (n div 2) do Begin
    temp := a[i];
    a[i] = a[n-i+1];
    a[n-i+1] := temp;
  end;
}
  t := true;
  while (t) do Begin
    t := false;
    for i:=1 to n-1 do 
      if a[i]<a[i+1] then begin 
        temp := a[i];
        a[i] := a[i+1];
        a[i+1] := temp;
        t := true;
      end;
  end;

  max := 0;
  for i := 1 to n do Begin
    max := max*10+a[i];
  end;

{ По идее здесь массив нужно отсортировать в возрастающем порядке.
  На т.к. он уже был отсортирован в убывающем порядке, то его можно просто перевернуть.
  Хотя можно былобы и не переворачивать массив. А просто в последующих циклах работать
  с им в обратном порядке }

  for i := 1 to (n div 2) do Begin
    temp := a[i];
    a[i] := a[n-i+1];
    a[n-i+1] := temp;
  end;

{ чтобы число неначиналась с 0 находим первый ненулевой элемент }
  i := 1;
  while ((i<n)and(a[i] = 0)) do
    i := i+1;
{ и меняем его с первым (нулевым) элементом местами }
  temp := a[1];
  a[1] := a[i];
  a[i] := temp;

  min := 0;
  for i := 1 to n do Begin
    min := min*10+a[i];
  end;
  writeln('min=',min);
  writeln('max=',max);
end.

или немного корече

Код:
const maxN = 10;
Type mas = array[1..maxN] of byte;
var a:mas;
    temp:byte;
    n,i:integer;
    t:boolean;
    x,max,min:integer;
begin
  write('X=');
  readln(x);
  n := 0;
  repeat
    n := n+1;
    a[n] := x mod 10;
    x := x div 10;
  until (x=0);

  t := true;
  while (t) do Begin
    t := false;
    for i:=1 to n-1 do 
      if a[i]<a[i+1] then begin 
        temp := a[i];
        a[i] := a[i+1];
        a[i+1] := temp;
        t := true;
      end;
  end;

  max := 0;
  for i := 1 to n do Begin
    max := max*10+a[i];
  end;

{ чтобы число неначиналась с 0 находим первый ненулевой элемент }
  i := n;
  while ((i>1)and(a[i] = 0)) do
    i := i-1;
{ и меняем его с последним (нулевым) элементом местами }
  temp := a[n];
  a[n] := a[i];
  a[i] := temp;

  min := 0;
  for i := n downto 1 do Begin

    min := min*10+a[i];
  end;
  writeln('min=',min);
  writeln('max=',max);
end.
На С# пишу лучше чем на русском.
"У меня правильнописание хромает. Оно хорошее, но почему-то хромает."
val_nnm вне форума Ответить с цитированием
Старый 30.10.2011, 13:52   #7
kidi911
 
Регистрация: 29.10.2011
Сообщений: 9
По умолчанию

Спасибо!Сам бы врятли догадался бы раскладать число в цикле
kidi911 вне форума Ответить с цитированием
Старый 30.10.2011, 14:29   #8
kidi911
 
Регистрация: 29.10.2011
Сообщений: 9
По умолчанию

Во 2 способе при вводе числа >10 000 делает ошибки,можно както поправить?Щас еще 1 способ проверю
kidi911 вне форума Ответить с цитированием
Старый 30.10.2011, 14:37   #9
val_nnm
Форумчанин
 
Регистрация: 18.10.2009
Сообщений: 185
По умолчанию

Сори в 1 способе поставил x,max,min:longint; а во 2 забыл.
(просто integer неможет хранить числа больше 32767 )

И ещё 1 вещь. Ещё можно в программу добавить проверку чтобы число небыло отрицательным и небыло слишком большим

Код:
...
...
  write('X=');
  readln(x);
  if (x<0) then begin
    writeln('Число недолжно быть отрицательным');
    exit;
  end;
  if (x>=1000000000) then begin
    writeln('Число должно быть меньше 1000000000');
    exit;
  end;
...
...
На С# пишу лучше чем на русском.
"У меня правильнописание хромает. Оно хорошее, но почему-то хромает."

Последний раз редактировалось val_nnm; 30.10.2011 в 14:49.
val_nnm вне форума Ответить с цитированием
Старый 30.10.2011, 14:53   #10
kidi911
 
Регистрация: 29.10.2011
Сообщений: 9
По умолчанию

Да,longint помогло.Проверку тоже вставил и ище readln повставлял,с ними не выбивает .exe файлы.Большое спасибо,теперь буду разбираться во всем этом,чтобы понять
kidi911 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Римские цифры NewMen Паскаль, Turbo Pascal, PascalABC.NET 5 14.06.2012 17:04
Наличие цифры Shouldercannon Общие вопросы Delphi 9 26.07.2010 08:20
Цифры текстов Maruff Microsoft Office Excel 1 10.12.2009 18:16
преобразование в цифры Артэс Общие вопросы C/C++ 8 23.11.2009 02:30
Сортирует цифры по строкам, а надо чтобы сортировала цифры , записанные через пробелы Алексей_xXx Помощь студентам 14 06.05.2009 17:42