Форум программистов, компьютерный форум CyberForum.ru

Сокращение расстояния Хэмминга - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Слова-анаграммы http://www.cyberforum.ru/cpp/thread228475.html
Для заданного с клавиатуры слова построить все его анаграммы, т.е. слова (возможно бессмысленные), состоящие из всех букв исходного слова, но расположенных в произвольном порядке. Хотя бы намекните, как реализовать
C++ Реализация стека вот такие ошибки при реализации: stack.h(26) : error C2953: 'Stack' : class template has already been defined liststack.h(10) : error C2955: 'Stack' : use of class template requires template argument list boundstack.h(6) : error C2955: 'Stack' : use of class template requires template argument list вот сами классы: BoundStack.h #include "Stack.h" #include <iostream> http://www.cyberforum.ru/cpp/thread228470.html
Реализовать игру человека и машины по заполнению “Греко-латинского квадрата” C++
Помогите решить программу на C++. “Греко-латинским квадратом” порядка N называют матрицу (N, N), в каждом столбце, каждой строке и обеих диагоналях которого содержатся все целые числа от1 до N . Реализовать игру человека и машины по заполнению “Греко-латинского квадрата”. Проигрывает тот, кто первым не сумеет сделать допустимый ход.
Нажно написать программу на языке програм С "моделирование движения" C++
Нужно написать программу моделирующую движение спутника вокруг планеты. Грубо говоря написать программу в которой будет один объект вращаться вокруг второго. Писать можно любыми способами но: программа должно быть написана на языке С а не С++ спутник не вращается вокруг своей оси,планета не вращается вокруг своей оси, спутник вращается только вокруг планеты, вращение происходит в 1 плоскости...
C++ Про CRC32 http://www.cyberforum.ru/cpp/thread228100.html
Народ, кто шарит в CRC, помогите. Прогу надо доделать или переделать, может у кого-нибудь рабочий вариант есть? Тестировалось в MV C++ 6. Bulder C++ 6. Borland 3.1. везде одни и теже ошибки #include <stdio.h> #include <string.h> #include <conio.h> void Update_CRC(char in, char *crc) { #define POLYNOMIAL 0xEDB88320//Полином *crc = *crc^in;
C++ Метод трапеций и прямоугольников помогите решить задачю. Делаю приложение MFC которое чертит графики двух функций и нахождения площади на заданом интервале ограничаной двумя функциями методом трапеци и прямоугольников, с прямоугольниками вроде как получилось а как быть с трапециями незнаю. //содержание task.cpp #include <stdio.h> #include <math.h> #include <float.h> #include "core.h" #include "task.h" #include... подробнее

Показать сообщение отдельно
lemegeton
 Аватар для lemegeton
2913 / 1342 / 133
Регистрация: 29.11.2010
Сообщений: 2,720
15.01.2011, 13:28     Сокращение расстояния Хэмминга
Ну тогда так.
C++
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
63
64
65
66
67
68
69
70
71
72
73
74
#include <cstdio>
#include <cstddef>
#include <cstdlib>
#include <ctime>
#include <cmath>
 
// подсчет количества бит, установленных в 1
size_t CountBits(const size_t a_number) {
  size_t temporary_number = a_number;
  size_t bits_counter = 0;
  while (temporary_number != 0) {
    if (temporary_number & 1) ++bits_counter;
    temporary_number >>= 1;
  }
  return bits_counter;
}
 
// подсчет количества разных бит
// нужно только для того, чтобы показать, что алгоритм работает
size_t CountDefferentBits(const size_t a, const size_t b) {
  return CountBits(a ^ b);
}
 
// подсчет расстояния Хэмминга для двух массивов
size_t HammingDistance(size_t *first_array, size_t *second_array,
                       size_t array_size) {
  size_t result = 0;
  for (int i = 0; i < array_size; ++i)
    result += CountDefferentBits(first_array[i], second_array[i]);
  return result;
}
 
size_t DecreaseHammingDistance(size_t *first_array, size_t *second_array,
                                size_t array_size, size_t bits_to_change) {
  size_t changed_bits = 0;
  size_t bits_in_element = sizeof(*first_array) * 8;
  size_t total_bits = array_size * bits_in_element;
  size_t current_bit = 0;
  while ((changed_bits < bits_to_change) && (current_bit < total_bits)) {
    size_t current_element = current_bit / bits_in_element;
    size_t bit_in_element  = current_bit % bits_in_element;
    if ((first_array[current_element]  & (1 << bit_in_element)) !=
        (second_array[current_element] & (1 << bit_in_element))) {
      first_array[current_element]  |= (1 << bit_in_element);
      second_array[current_element] |= (1 << bit_in_element);
      ++changed_bits;
    }
    ++current_bit;
  }
  return changed_bits;
}
 
int main(int argc, char *argv[]) {
  srand(time(NULL));
 
  // инициализация двух массивов
  size_t array_size = 20 + rand() % 10;
  size_t *first_array = new size_t[array_size];
  size_t *second_array = new size_t[array_size];
 
  // заполнение двух массивов случайными числами
  for (int i = 0; i < array_size; ++i) {
    first_array[i]  = rand() % 65535;
    second_array[i] = rand() % 65535;
  }
 
  printf("%d\n", HammingDistance(first_array, second_array, array_size));
  printf("%d\n", DecreaseHammingDistance(first_array, second_array, array_size, array_size));
  printf("%d\n", HammingDistance(first_array, second_array, array_size));
  // удаление массивов
  delete [] first_array;
  delete [] second_array;
  return 0;
}
Добавлено через 30 минут
Если нужно менять только один массив.
C++
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
63
64
65
66
67
68
69
70
71
72
73
74
75
#include <cstdio>
#include <cstddef>
#include <cstdlib>
#include <ctime>
#include <cmath>
 
// подсчет количества бит, установленных в 1
size_t CountBits(const size_t a_number) {
  size_t temporary_number = a_number;
  size_t bits_counter = 0;
  while (temporary_number != 0) {
    if (temporary_number & 1) ++bits_counter;
    temporary_number >>= 1;
  }
  return bits_counter;
}
 
// подсчет количества разных бит
// нужно только для того, чтобы показать, что алгоритм работает
size_t CountDefferentBits(const size_t a, const size_t b) {
  return CountBits(a ^ b);
}
 
// подсчет расстояния Хэмминга для двух массивов
size_t HammingDistance(size_t *first_array, size_t *second_array,
                       size_t array_size) {
  size_t result = 0;
  for (int i = 0; i < array_size; ++i)
    result += CountDefferentBits(first_array[i], second_array[i]);
  return result;
}
 
size_t DecreaseHammingDistance(size_t *first_array, size_t *second_array,
                                size_t array_size, size_t bits_to_change) {
  size_t changed_bits = 0;
  size_t bits_in_element = sizeof(*first_array) * 8;
  size_t total_bits = array_size * bits_in_element;
  size_t current_bit = 0;
  while ((changed_bits < bits_to_change) && (current_bit < total_bits)) {
    size_t current_element = current_bit / bits_in_element;
    size_t bit_in_element  = current_bit % bits_in_element;
    if ((first_array[current_element]  & (1 << bit_in_element)) !=
        (second_array[current_element] & (1 << bit_in_element))) {
      //second_array[current_element] |= (1 << bit_in_element);
      //first_array[current_element]  |= (1 << bit_in_element);
      second_array[current_element] ^= (1 << bit_in_element);
      ++changed_bits;
    }
    ++current_bit;
  }
  return changed_bits;
}
 
int main(int argc, char *argv[]) {
  srand(time(NULL));
 
  // инициализация двух массивов
  size_t array_size = 20 + rand() % 10;
  size_t *first_array = new size_t[array_size];
  size_t *second_array = new size_t[array_size];
 
  // заполнение двух массивов случайными числами
  for (int i = 0; i < array_size; ++i) {
    first_array[i]  = rand() % 65535;
    second_array[i] = rand() % 65535;
  }
 
  printf("%d\n", HammingDistance(first_array, second_array, array_size));
  printf("%d\n", DecreaseHammingDistance(first_array, second_array, array_size, array_size * sizeof(size_t) * 8));
  printf("%d\n", HammingDistance(first_array, second_array, array_size));
  // удаление массивов
  delete [] first_array;
  delete [] second_array;
  return 0;
}
 
Текущее время: 01:12. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru