Подсчет, сколько раз целое число равно самому себе, затем вычисление процента - PullRequest
1 голос
/ 29 марта 2012

У меня есть массив, и у меня есть целые числа в массиве. Я пытаюсь подсчитать количество повторений целых чисел в массиве. После этого я хочу напечатать процент. Это то, что я до сих пор.

for(i = 2; i < 8; i++){
    mmblk[i] = (num[i] / bsize);   //mmblk[i] =0,0,1,9,0,1
    if(mmblk[i] == mmblk[i]){      
        count ++;
        p = count/num[0];
        percent = (p * 100);
    }
}
printf("Highest possible hit rate = %d/%d = %d %\n", count, num[0], percent);//num[0]=6

За вывод получаю: Максимально возможный коэффициент попадания = 0/6 = 0

Вывод должен выглядеть так: Максимально возможный коэффициент попадания = 3/6 = 50%

Я знаю, что происходит что-то не так, но я не могу понять, что это. Любая помощь будет принята с благодарностью.

Ответы [ 3 ]

0 голосов
/ 29 марта 2012

Так что, если я правильно понимаю, вы ищете максимальное количество повторяющихся значений в массиве.

func( {1,2,3} ) = 0
func( {1,1,3} ) = 2
func( {1,1,1} ) = 3

Чтобы получить процент, вы просто делите этот результат на длину массива.

Проблема в том, что ваша функция слишком проста, и не совсем решение.

Решение, которое я придумываю при первом подходе, состоит в том, чтобы иметь другой массив с именем count. Это та же длина, что и ваш исходный массив. В конечном итоге это число раз, которое появляется каждое число в исходном массиве.

Для каждого элемента в исходном массиве вы подсчитываете, сколько раз появляется это число, и сохраняете результат. Затем вы найдете максимум массива count, и у вас есть а) значение максимального повторения, которое вы ищете, и б) индекс соответствующего значения максимального повторения из исходного массива.

Для примера {0,0,1,9,0,1}:

src    counts
  0       3        Max 
  0       3
  1       2
  9       1
  0       3
  1       2

Одной из оптимизаций этого является то, что во время подсчета, если вы встретите то же число ранее в массиве, вы можете остановиться, потому что вы уже посчитали повторы для этого значения.

С этим на месте, ваш результат:

src    counts
  0       3        Max 
  0       0        
  1       2
  9       1
  0       0
  1       0

Еще одна оптимизация - начать отсчет только с текущего индекса в массиве. Это работает по той же причине, что и другая оптимизация.

Результаты:

src    counts
  0       3        Max 
  0       2
  1       2
  9       1
  0       1
  1       1
0 голосов
/ 29 марта 2012

Я бы порекомендовал связанный список или какой-либо другой контейнер переменной длины, где каждый узел данных хранит число и сколько раз оно встречается.

В псевдокоде:

VariableLengthContainer v = EMPTY-CONTAINER n = размер (входной) для каждого числа на входе, если этот номер находится в контейнере, в противном случае увеличьте его счетчик, добавьте этот номер в контейнер и установите его счет на 1

0 голосов
/ 29 марта 2012

если у вас есть только маленькие целые числа, вы можете использовать массив, в котором вы подсчитываете количество вхождений целых чисел

const int MAX_INT = 1024;
const int FIRST   = 2;
const int LAST    = 7;

unsigned int count[MAX_INT];
int i;

for (i = 0; i < MAX_INT; i++)
    count[i] = 0;

for (i = FIRST; i <= LAST; i++) {
    if (numbers[i] >= MAX_INT) {
        fprintf(stderr, "Too large number");
        exit 1;
    }
    count[numbers[i]] += 1;
}

for (i = 0; i < MAX_INT; i++)
    if (count[i] > 0)
        // print your statistics

Если у вас встречаются большие целые числа, такие большие, что вы не можете создать свой массив count достаточно большой, вам понадобится что-то более сложное, я думаю;сначала можно отсортировать номера.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...