0 / 0 / 1
Регистрация: 24.11.2016
Сообщений: 14
1

Вычислить количество IP адресов, которые можно составить из данного числа

15.12.2017, 12:26. Показов 1315. Ответов 10
Метки нет (Все метки)

Помогите решить следующую задачу. (нужна идея). Имеется целое число от 4 до 14 разрядов. Нужно вычислить количество IP адресов которые можно составить из данного числа.
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
15.12.2017, 12:26
Ответы с готовыми решениями:

Определить количество всех различных 3-х значных чисел, которые можно составить из цифр данного числа
Дано 3-х значное число, определить количество всех различных 3-х значных чисел, которые можно...

Определить количество различных чисел, которое можно составить из цифр данного числа
Вводится трёхзначное число. Определить количество различных чисел, которое можно составить из цифр...

Требуется найти слова, которые можно составить из данного
Здравствуйте. Пользователь вводит слово. Слова, которые вообще известны, находятся в текстовом...

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

10
Модератор
9474 / 4799 / 3209
Регистрация: 17.08.2012
Сообщений: 15,035
15.12.2017, 23:26 2
Garry66, условие некорректное. Может быть, так:

"Имеется целое положительное десятичное число длиной от 4 до 14 разрядов. Нужно вычислить количество IP-адресов которые можно составить из разрядов данного числа. Любой разряд числа при составлении IP-адреса повторно использовать нельзя."

?
0
0 / 0 / 1
Регистрация: 24.11.2016
Сообщений: 14
16.12.2017, 21:04  [ТС] 3
Все так, но идея решения есть?
0
Модератор
9474 / 4799 / 3209
Регистрация: 17.08.2012
Сообщений: 15,035
16.12.2017, 21:53 4
Кроме полного перебора, никаких идей. Генерировать перестановки например, с помощью алгоритма Нарайаны, и из каждой перестановки составлять всевозможные адреса и проверять их на допустимость. Тоже целая эпопея, сгенерировать из текущей перестановки всевозможные одно- двух- и трёхзначные числа, пускай и подряд идущие. То есть, максимальное количество проверок будет не 14!, а несколько побольше.
0
0 / 0 / 1
Регистрация: 24.11.2016
Сообщений: 14
17.12.2017, 12:04  [ТС] 5
Пусть перебор. Но как? Переводил все в текстовый формат, и проверял вхождение адреса (сформированного вложенными циклами) функцией POS. Но программа долго работает (зависает). Эта задача районного уровня школьной олимпиады по информатике, поэтому, я думаю, что решение должно быть проще.
0
Модератор
9474 / 4799 / 3209
Регистрация: 17.08.2012
Сообщений: 15,035
17.12.2017, 12:51 6
А чего ж полному перебору не зависать? 14! = 87178291200 только перестановок исходных цифр, а ещё нужно и адрес формировать... А тут ещё и тормозное pos (эта комманда - по любому цикл, пусть даже и с использованием шустрой ассемблерной инструкции scas). Проще вряд ли получится, потому что каждое поле IP-адреса может содержать от 1 до 3 цифр, да ещё и чтобы полученное значение поля было в диапазоне 0..255. Не знаю. Думал ещё насчёт массива количеств цифр (типа d[0..10] of byte, например), но - всё равно выползает на свет Божий алгоритм Нарайаны, только в усложнённом виде.

Добавлено через 4 минуты
Да, и, если количество адресов сравнимо с 14!, то оно в longint не влезет. Какой диалект паскаля используете? В нём есть тип int64, например? Школьная олимпиада, говорите? Странно. Хотя... Возможно, составитель задачи наивно считает, что диапазон поля IP-адреса 0..999, тогда проще получается, но не на много.
0
0 / 0 / 1
Регистрация: 24.11.2016
Сообщений: 14
18.12.2017, 10:34  [ТС] 7
Диапазон поля, по условию, 0...255.
0
Модератор
9474 / 4799 / 3209
Регистрация: 17.08.2012
Сообщений: 15,035
18.12.2017, 14:46 8
Мой вариант, с перебором по IP:
Pascal
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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
var
  ip, nip, t: longword;
  p, n, k, i, j: byte;
  num: array[1..14] of byte;
  ipn: array[1..12] of byte;
  b: array[1..14] of boolean;
  err: boolean;
  s: string;
 
begin
  repeat //ввод массива цифр с проверкой
    write('Введите целое десятичное число длиной от 4 до 14 разрядов: ');
    readln(s);
    n := length(s);
    err := (n = 0) or (n < 4) or (n > 14) or not (s[1] in ['1'..'9']);
    if not err
      then for i := 1 to n do
        begin
          err := not (s[i] in ['0'..'9']);
          if not err
            then num[i] := ord(s[i]) - ord('0')
            else break
        end
  until not err;
  nip := 0;
  writeln('0%                            50%                             100%'); //progressbar
  writeln('                               |                               |'); //progressbar
  for ip := 0 to $FFFFFFFF do
    begin
      if ip and $3FFFFFF = 0 then write('|'); //progressbar
      for i := 1 to n do b[i] := false;
      k := 0;
      t := ip;
      for i := 1 to 4 do
        begin
          p := t mod $100;
          t := t div $100;
          repeat
            inc(k);
            ipn[k] := p mod 10;
            p := p div 10
          until p = 0
        end;
      for i := 1 to k do
        begin
          for j := 1 to n do
            begin
              err := (ipn[i] <> num[j]) or b[j];
              if not err
                then begin
                  b[j] := true;
                  break
                end
            end;
          if err then break
        end;
      if not err then inc(nip)
    end;
  writeln; //progressbar
  write('IP quantity = ', nip);
  readln
end.
0
0 / 0 / 1
Регистрация: 24.11.2016
Сообщений: 14
19.12.2017, 10:33  [ТС] 9
Лучший ответ Сообщение было отмечено ZX Spectrum-128 как решение

Решение

Как то очень сложно для школы.
Теперь мой вариант. Тоже перебор, но через строки. Сбило с толку, что в условии не сказано, что все цифры должны быть использованы.

Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
program ip;
 
var
  s: string;
  i, j, k, l, n, a, b, c, d, code: integer;
 
begin
  readln(s);
  n := 0;
  for i := 1 to 3 do
    for j := 1 to 3 do
      for k := 1 to 3 do
        for l := 1 to 3 do
          if i + j + k + l = length(s) then
          begin
            val(copy(s, 1, i), a, code);
            val(copy(s, i + 1, j), b, code);
            val(copy(s, i + j + 1, k), c, code);
            val(copy(s, i + j + k + 1, l), d, code);
            if (a <= 255) and (b <= 255) and (c <= 255) and (d <= 255) then n := n + 1;
          end;
  writeln(n);
end.
0
Модератор
9474 / 4799 / 3209
Регистрация: 17.08.2012
Сообщений: 15,035
19.12.2017, 12:26 10
Ваша программа не учитывает, что цифры исходного числа могут использоваться в IP-адресе в любом порядке. В условии нигде не указано, что цифры в IP-адресе должны идти в том же порядке, что и в исходном числе. Следовательно, Ваша программа не верна.
0
0 / 0 / 1
Регистрация: 24.11.2016
Сообщений: 14
19.12.2017, 19:35  [ТС] 11
Согласен. Условие задачи допускает вольности. Меня тоже сбило с толку то, что все цифры должны быть использованы.Но тем не менее все тесты, выданные для проверки, прошли. Следовательно, за данное решение получаем максимальное количество баллов. Тему можно закрывать. Всем спасибо!
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
19.12.2017, 19:35
Помогаю со студенческими работами здесь

Найти наибольшее и наименьшее из чисел, которые можно составить из всех цифр данного
Задано натуральное число N. Найти наименьшее и наибольшее число, состоящее из тех же цифр и в таком...

Количество прямоугольников, которые можно вырезать из данного листа бумаги
Не про спиннеры. Саша совсем не любит спиннеры, поэтому он рисует в тетрадке . Он взял тетрадный...

Дано натуральное число N. Определить количество цифр в цифровой записи данного числа, которые имеют наименьшее значение. Пример. N = 4548. Количество
помощи прошу) Дано натуральное число N. Определить количество цифр в цифровой записи данного...

Найти количество слов, которые можно получить перестановкой букв данного слова
Сколько различных слов можно получить перестановкой букв слова &quot;ПРЕЦЕНДЕНТ&quot; - буквы Е не стоят...


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru