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

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

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 11.12.2012, 21:38   #1
Logannn
Пользователь
 
Регистрация: 15.10.2012
Сообщений: 16
По умолчанию Нахождение моды

Подскажие как найти моду, например имеется массив

int mas3[] = { 2, 5, 3, 7, 0, -56, -7, 4, 5, 7};

Мода в данном случае 5 ; 7
Logannn вне форума Ответить с цитированием
Старый 13.12.2012, 17:24   #2
Logannn
Пользователь
 
Регистрация: 15.10.2012
Сообщений: 16
По умолчанию

Уточню вопрос, у меня уже имеется готовый код для нахождение мод в массиве (не мой и я его плохо понимаю). Количество выводимых строк в результате и есть общее количество мод, что надо добавить чтобы их посчитать?




Код:
#include<stdio.h>

int main()
{
  int m, test, w, g, t;
  int povtori[30];
  int znachenie[30];
  int max = 0;
  float b = 0;
  int mas3[] = { 2, 5, 3, 7, 0, 5, 3, -2, 4, 4, 4, 5, 5, 5, 4, 0, 4};

 for (m = 0; m < (sizeof(mas3)/sizeof(int)); m++)
        {
 int t = 0;
                for (w = m; w < (sizeof(mas3)/sizeof(int)); w++)
                        {
                        if (mas3[m] == mas3[w])
                                {
                                t = t + 1;
                                }
                        }

                znachenie[m] = mas3[m];
                povtori[m] = t;
        }




for (g = 0; g < (sizeof(mas3)/sizeof(int)); g++)
        {
        if (povtori[g] > max)
                {
                max = povtori[g];
                }


        }


for (t = 0; t < (sizeof(mas3)/sizeof(int)); t++)
{
        if (povtori[t] == max)
        {
        printf("Moda massiva: %d\n", znachenie[t]);
        }

}
}
Logannn вне форума Ответить с цитированием
Старый 13.12.2012, 21:13   #3
Nuklon
Форумчанин
 
Аватар для Nuklon
 
Регистрация: 05.04.2012
Сообщений: 134
По умолчанию

Код:
#include <stdio.h>


typedef struct _var {
    int v, n;
} var;


// функция подсчёта повторений
var* cnt_moda(const int* f, const int* l, var* v) {
    var* p, *n;
    for(n = v; f != l; ++f) {
        for(p = v; (p != n) && (p->v != *f); ++p);
        p->v = *f;
        p->n++;
        if(p >= n) 
            ++n;
    }
    return v + (n - v);
}

// функция возвращает максимум повторений
int max_moda(const var* f, const var* l) {
   int m = f->n;
   while(f != l) {
       if(f->n > m)
            m = f->n;
       ++f;
   }
   return m;
}



int main(void)
{
   int mas[] = { 2, 5, 3, 7, 0, -56, -7, 4, 5, 7, -56 };
   int cnt;
   var vs[11] = {0}; 
   var *it, *end;

   end = cnt_moda(mas, mas + sizeof(mas)/sizeof(mas[0]), vs);
   cnt = max_moda(vs, end);

   for(it = vs; it != end; ++it) {
        if(it->n == cnt)
            printf("moda: %d\n", it->v);
   }
   return 0;
}
P.S. Для больших массивов лучше использовать хэш-таблицу.
Nuklon вне форума Ответить с цитированием
Старый 14.12.2012, 14:11   #4
Logannn
Пользователь
 
Регистрация: 15.10.2012
Сообщений: 16
По умолчанию

Моды мне удалось найти с моим кодом, подскажите как сделать так чтобы посчитать количество мод?
Logannn вне форума Ответить с цитированием
Старый 14.12.2012, 14:36   #5
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

Заведите переменную "количество мод", инициализируйте нулём, при том же условии, при котором выводите моду, увеличивайте эту переменную на 1.
Abstraction вне форума Ответить с цитированием
Старый 16.12.2012, 23:12   #6
Logannn
Пользователь
 
Регистрация: 15.10.2012
Сообщений: 16
По умолчанию

Спасибо действительно работает, а мы отсидели весь вечер в универе..
Logannn вне форума Ответить с цитированием
Старый 14.01.2013, 16:55   #7
Logannn
Пользователь
 
Регистрация: 15.10.2012
Сообщений: 16
По умолчанию

Подскажите пожалуйста как возвести 2^349 и найти остаток от деления этого числа на 341 ?
Logannn вне форума Ответить с цитированием
Старый 14.01.2013, 17:22   #8
Blind Guard
Форумчанин
 
Регистрация: 14.03.2012
Сообщений: 139
По умолчанию

Цитата:
Сообщение от Logannn Посмотреть сообщение
Спасибо действительно работает, а мы отсидели весь вечер в универе..
Как говорит мой дед: "Не знаешь — спрашивай у того, кто знает."
Blind Guard вне форума Ответить с цитированием
Старый 14.01.2013, 17:24   #9
Blind Guard
Форумчанин
 
Регистрация: 14.03.2012
Сообщений: 139
По умолчанию

Цитата:
Сообщение от Logannn Посмотреть сообщение
Подскажите пожалуйста как возвести 2^349 и найти остаток от деления этого числа на 341 ?
Код:
double d;
d = pow(2,349)%341; // по-мойму так
Правда я оочень сомневаюсь, что такое огромное число не вызовет ошибку.

Последний раз редактировалось Blind Guard; 14.01.2013 в 17:27.
Blind Guard вне форума Ответить с цитированием
Старый 14.01.2013, 17:34   #10
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

Тупой способ: берёте единичку и 349 раз умножаете объект на 2, находите остаток от деления на 341.
Умный способ: пусть нужно умножить у на (число х в степени а) по модулю М. Если а чётное, то можно возвести х в квадрат, найти остаток от деления на М, поделить а на два, повторить. Если а нечётное, то можно домножить у на х, найти остаток от деления на М, вычесть из а единичку, повторить. Если а равно нулю, ответ тривиален:
Код:
int FindDegreeByModulo(int x, int degree, int M){
  int y=1;
  while(degree != 0){
    if(degree%2 == 1){
      y = (y*x)%M;
    }
    x = (x*x)%M;
    degree >>= 1;
  }
  return y;
}
Очень умный способ: 2^10 = 1024 = 341*3+1; (2^349)%341 = (2^340*2^9)%341 = 512%341 = 171.

Есть ещё очень-очень умный способ, с привлечением теоремы Эйлера, но в данном случае он хуже предыдущего.
Abstraction вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Поиск моды среди неизвестного кол-ва положительных чисел. c++ Trigger man Помощь студентам 1 27.08.2012 19:24
Нахождение моды в массиве. Maksimall89 Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 2 15.11.2011 20:00
Нахождение месяца i.yakushev Помощь студентам 4 04.05.2011 20:16
моды и карты к half-life alhon Gamedev - cоздание игр: Unity, OpenGL, DirectX 14 05.10.2009 14:12