Форум программистов, компьютерный форум, киберфорум
Pascal (Паскаль)
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.94/18: Рейтинг темы: голосов - 18, средняя оценка - 4.94
5 / 5 / 0
Регистрация: 20.06.2016
Сообщений: 87
1

Определить, на сколько бит различаются два числа

04.03.2017, 20:30. Показов 3249. Ответов 30
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Привет всем у меня такой вапрос )
как узнать на сколько битов различаеться два числа ??

неужели надо переводить в двоичную СМ и потом смотреть различие

напр
12 и 8

12 = 1100
8=1000
они различаються на один бит т.к вторая цифра числа 12 есть 1 а у 8 есть 0 ?

суть задачи такая дано (n и k )
и a1,a2,a3....an
n<=10000
ИСПРАВЛЕНО: n<=100000

надо найти количество пар чисел что они различаються на k бит ?

пример

4 1
0 3 2 1

ответ
(1, 3),
(1, 4),
(2, 3),
(2, 4).
всего 4 !

я решил эту задачу так
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
var
n,i,j,q,m,kol,otv,k:longint;
a:array[1..10000]of integer;
begin
readln(n,k);
for i:=1 to n do read(a[i]);
for i:=1 to n-1 do begin
for j:=i+1 to n do begin
    q:=a[i];
    m:=a[j];
    kol:=0;
    while (q>0)or(m>0) do begin
        if (q mod 2)<>(m mod 2) then inc(kol);
        q:=q div 2;
        m:=m div 2;
    end;
    if kol=k then inc(otv);
end;
end;
writeln(otv);
end.
но по времени не прошло
ограничения времени 2 сек

что делать ? )


зарания спасибо )
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
04.03.2017, 20:30
Ответы с готовыми решениями:

Определить, сколько битов в числах N1 и N2 различаются
Определить, сколько битов в числах N1 и N2 различаются. Вывести номера позиций этих битов....

Определить, чем различаются два экземпляра одного класса
Доброго времени суток! Имеется класс А с 20 свойствами. В процессе работы программы создаются два...

Задано два натуральных числа: m и n. Определить, сколько цифр содержится в десятичной записи числа m^n.

Определить сколько раз встречается последовательно два числа одного знака
Здравствуйте. Дан одномерный массив из n элементов в диапазоне от -10 да 10. Определить сколько...

30
Модератор
Эксперт по электронике
8476 / 4335 / 1642
Регистрация: 01.02.2015
Сообщений: 13,461
Записей в блоге: 8
04.03.2017, 20:57 2
XOR обоих чисел и подсчёт единиц.

Добавлено через 5 минут
А какие ограничения на сами числа?
0
5 / 5 / 0
Регистрация: 20.06.2016
Сообщений: 87
04.03.2017, 21:00  [ТС] 3
k<=14
a[i]<=10^5
0
Модератор
Эксперт по электронике
8476 / 4335 / 1642
Регистрация: 01.02.2015
Сообщений: 13,461
Записей в блоге: 8
04.03.2017, 21:01 4
Ускорение подсчёта бит
http://myworkonly.blogspot.ru/... st_05.html
https://habrahabr.ru/post/276957/
0
5 / 5 / 0
Регистрация: 20.06.2016
Сообщений: 87
04.03.2017, 21:07  [ТС] 5
это там просто на с++ )) не понятно
не могли бы на паскале помочь?)

xor и подсчет кол единиц правильно но не проходит по времени (
0
Модератор
Эксперт по электронике
8476 / 4335 / 1642
Регистрация: 01.02.2015
Сообщений: 13,461
Записей в блоге: 8
04.03.2017, 21:09 6
Лучший ответ Сообщение было отмечено ProHacker как решение

Решение

Я бы сделал подсчёт комбинированным способом.
Сделал бы предзаполненный массив Bits[0..255] такой, что Bits[i] содержит количество единичных бит в числе i (0<=i<=255).
Потом этот массив использовал для подсчёта количества единичных бит в числе x:=a[i] xor a[j]
kol:=Bits[Lo(x)]+Bits[Hi(x)]
Ну и дальше - как у вас в коде.
0
5 / 5 / 0
Регистрация: 20.06.2016
Сообщений: 87
04.03.2017, 21:12  [ТС] 7
а можете полный код написать плз ))
0
Модератор
Эксперт по электронике
8476 / 4335 / 1642
Регистрация: 01.02.2015
Сообщений: 13,461
Записей в блоге: 8
04.03.2017, 21:18 8
Лучший ответ Сообщение было отмечено ProHacker как решение

Решение

Цитата Сообщение от ProHacker Посмотреть сообщение
xor и подсчет кол единиц правильно но не проходит по времени (
А как вы так быстро проверили и XOR и подсчёт?

Ну посчитайте единицы делением (как умеете) и занесите в массив Bits[i]. При больших объёмах даст существенный выигрыш.

Добавлено через 1 минуту
Нет, сейчас, точно - нет. Мне необходимо отлучиться. А когда вернусь - будет пора спать.
Попробуйте вариант с массивом.
0
5 / 5 / 0
Регистрация: 20.06.2016
Сообщений: 87
04.03.2017, 22:39  [ТС] 9
на вопрос как я проверяю xor и подсчет единиц
я делаю так
Pascal
1
2
3
4
5
c:=a[i] xor a[b] ;
while c>0 do begin
if c mod 2 = 1 then inc(kol);
c:=c div 2;
end;
вот так )) думаю туфта !)

Добавлено через 9 минут
Я бы сделал подсчёт комбинированным способом.
Сделал бы предзаполненный массив Bits[0..255] такой, что Bits[i] содержит количество единичных бит в числе i (0<=i<=255).
Потом этот массив использовал для подсчёта количества единичных бит в числе x:=a[i] xor a[j]
kol:=Bits[Lo(x)]+Bits[Hi(x)]
Ну и дальше - как у вас в коде


а что вы имеели в в lo(x) и Hi(x) ?

Добавлено через 1 час 11 минут
Народ помогите )
0
Модератор
Эксперт по электронике
8476 / 4335 / 1642
Регистрация: 01.02.2015
Сообщений: 13,461
Записей в блоге: 8
05.03.2017, 00:15 10
Отладочный вариант
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
program BitsCount;
 
var
  Bits08: array [0..255] of integer;
  Bits20: array [0..(1 shl 20) - 1] of integer;
  n, k: longint;
  a: array [0..10000] of longint;
  i, j: longint;
  Amount: longint;
  x: longint;
begin
  randomize;
  {ввод исходных данных}
  readln(n, k);
  for i := 0 to n - 1 do
    //Read(a[i]);
    a[i] := random(10000);
  {предвычисление таблицы}
  for i := 0 to 255 do
  begin
    x := ((i shr 1) and $55) + (i and $55);
    x := ((x shr 2) and $33) + (x and $33);
    x := ((x shr 4) and $0F) + (x and $0F);
    Bits08[i] := x;
  end;
  for i := 0 to high(Bits20) do
    Bits20[i] := Bits08[i and $FF] + Bits08[(i shr 8) and $FF] +
      Bits08[(i shr 16) and $FF];
  {вычисление результата}
  Amount := 0;
  for i := 0 to n - 2 do
    for j := i + 1 to n - 1 do
    begin
      x := a[i] xor a[j];
      if k = Bits20[x] then
        Inc(Amount);
    end;
  writeln(Amount);
end.
0
Модератор
Эксперт Pascal/DelphiЭксперт NIX
7769 / 4598 / 2823
Регистрация: 22.11.2013
Сообщений: 13,077
Записей в блоге: 1
05.03.2017, 01:00 11
ФедосеевПавел,
для 10^5 достаточно 17 бит. Или 20 бит выбрано исходя из каких-то иных соображений?

Добавлено через 23 минуты
Вариант с 2-я таблицами в среднем:
Код
$ time echo 10000 5 | ./z 

real	0m0.257s
user	0m0.243s
sys	0m0.008s
Если 2-ю таблицу заменить суммой, будет похуже, но тоже с большим запасом:
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
var
  Bits08: array [0..255] of Integer;
  n, k: longint;
  a: array [0..10000] of Longint;
  i, j: Integer;
  Amount, x: Longint;
begin
  Randomize;
  {ввод исходных данных}
  ReadLn(n, k);
  for i := 0 to n - 1 do
    {Read(a[i]);}
    a[i] := Random(10000);
  {предвычисление таблицы}
  for i := 0 to 255 do
  begin
    x := ((i shr 1) and $55) + (i and $55);
    x := ((x shr 2) and $33) + (x and $33);
    x := ((x shr 4) and $0F) + (x and $0F);
    Bits08[i] := x;
  end;
  {вычисление результата}
  Amount := 0;
  for i := 0 to n - 2 do
    for j := i + 1 to n - 1 do
    begin
      x := a[i] xor a[j];
      if k = Bits08[x and $FF] + Bits08[(x shr 8) and $FF] +
        Bits08[(x shr 16) and $FF]
      then Inc(Amount);
    end;
  WriteLn(Amount);
end.
Код
$ time echo 10000 5 | ./z 

real	0m0.391s
user	0m0.360s
sys	0m0.008s
1
5 / 5 / 0
Регистрация: 20.06.2016
Сообщений: 87
05.03.2017, 01:46  [ТС] 12
жалко что по времени не проходит (
0
Модератор
Эксперт по электронике
8476 / 4335 / 1642
Регистрация: 01.02.2015
Сообщений: 13,461
Записей в блоге: 8
05.03.2017, 01:51 13
Цитата Сообщение от bormant Посмотреть сообщение
для 10^5 достаточно 17 бит. Или 20 бит выбрано исходя из каких-то иных соображений?
Делал в полусне и 10^5 оценил в двоичном виде как 20 бит.

ProHacker, а где вы проверяете? И измените 20 на 17 - может поможет...

Добавлено через 36 секунд
И какой код вы даёте системе?
0
5 / 5 / 0
Регистрация: 20.06.2016
Сообщений: 87
05.03.2017, 01:54  [ТС] 14
я ваш код не могу запустить так как мой паскаль говорит неизвестный идентификатор high
в цикле for i:=0 to ...
0
Модератор
Эксперт по электронике
8476 / 4335 / 1642
Регистрация: 01.02.2015
Сообщений: 13,461
Записей в блоге: 8
05.03.2017, 02:02 15
Замените на соответствующее значение high

Добавлено через 1 минуту
И вы не ответили
1. сайт
2. что за код вы даёте системе

Добавлено через 2 минуты
Когда я учился в школе - на 4 компьютерах было 5 или 6 диалектов BASIC, и были книги и журналы ещё на другие 5-6 диалектов. Ничего - как-то же набирали, учились...
0
5 / 5 / 0
Регистрация: 20.06.2016
Сообщений: 87
05.03.2017, 02:09  [ТС] 16
ваш код проходит по времени очень даже хорошо
но вот 13 тест там не проходит почему то
может у вас есть там баг ?

Добавлено через 49 секунд
код ошибки
ошибка исполнения

Добавлено через 2 минуты
ну сайт я вам сказать не могу )) это большой секрет ))
и я отправляю ваш код

Добавлено через 2 минуты
а вот код вашего колеги не проходит по времени 13 тест
а у вас наоборот выходит ошибка исполнения
0
Модератор
Эксперт по электронике
8476 / 4335 / 1642
Регистрация: 01.02.2015
Сообщений: 13,461
Записей в блоге: 8
05.03.2017, 02:14 17
Увеличьте разрядность одной переменной Amount до uint64 или qword.
Вы не можете отправлять мой код - он отладочный и не вводит переменных.

Добавлено через 1 минуту
И не у меня - а у вас. Мне эта задача с секретного сайта - до лампочки.
0
5 / 5 / 0
Регистрация: 20.06.2016
Сообщений: 87
05.03.2017, 02:19  [ТС] 18
я просто дописал что вводил переменные ))

Добавлено через 4 минуты
нашел ошибку )
у вас там в коде a:array[0..10000] а надо до a:array[0.100000]
но по времени что то не прошло (
я ошибался когда сказал что у вас по времени проходит

Добавлено через 1 минуту
извините что я сам в начале написал что n<=10000 она должна быть n<=100000
0
Модератор
Эксперт по электронике
8476 / 4335 / 1642
Регистрация: 01.02.2015
Сообщений: 13,461
Записей в блоге: 8
05.03.2017, 02:47 19
Значит нужно уменьшать количество вариантов перебора.
Может быть сортировать по количеству бит и сравнения делать по потенциальным группам, а не с остатками массива.
0
Модератор
Эксперт Pascal/DelphiЭксперт NIX
7769 / 4598 / 2823
Регистрация: 22.11.2013
Сообщений: 13,077
Записей в блоге: 1
05.03.2017, 11:00 20
При n:1..100000 нужно искать другой алгоритм, текущий не сильно лучше квадратичного от n.

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

Добавлено через 43 минуты
Что-то вроде:
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
const MaxBit=16;
var
  a: array [0..MaxBit] of Longint;
  b: array [0..255] of Integer;
  n, i, t: Longint;
  k, j: Integer;
  r: Int64;
begin
  Randomize;
  {предвычисление таблицы}
  for j:=0 to 255 do begin
    k:=((j shr 1) and $55)+(j and $55);
    k:=((k shr 2) and $33)+(k and $33);
    k:=((k shr 4) and $0F)+(k and $0F);
    b[j]:=k;
  end;
  ReadLn(n,k);
  for n:=1 to n do begin
    t:=(Longint(Random(65535))+Random(65535)) mod 100001;
    Inc(a[b[ t         and $FF]+
          b[(t shr 8)  and $FF]+
          b[(t shr 16) and $FF]]);
  end;
  for j:=k to MaxBit do  Inc(r,a[j-k]*a[j]);
  WriteLn(r);
end.
Добавлено через 22 минуты
Для r в строгом смысле не хватает Longint, т.к. в худшем случае 50000 одного числа, 50000 другого, 2_500_000_000 всего и это больше 2_147_483_647‬.

Кстати, в условии не сказано, не нужно ли при подсчете количества исключать дубликаты, если такие будут...

Добавлено через 3 минуты
ФедосеевПавел,
что думаете по поводу алгоритма?
0
05.03.2017, 11:00
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
05.03.2017, 11:00
Помогаю со студенческими работами здесь

Даны два натуральных числа. Определить сколько чисел на отрезке между ними являются факториалами
Даны два натуральных числа. Определить сколько чисел на отрезке между ними являются факториалами....

Вводятся два целых числа. Определить, сколько парных чисел находится между ними и найти их сумму
Ребят, помогите пожалуйста, очень срочно нужно решить в Delphi: Вводятся два целых числа....

При сложении по модулю два двух чисел по 48 бит пропадает 1 бит
Здравствуйте, помогите пожалуйста. В этой строке пропадает 1 бит, т.е. должно быть 48, а их 47. R...

На сколько GT740m 128 бит производительней GT740 64 бит
Доброго времени суток! В скором времени будет куплен ноутбук, предположительно с видеокартой...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru