Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   Расположить в последовательности числа в порядке убывания частоты встречаемости (http://forum.oszone.net/showthread.php?t=140685)

.::.DIMA.::. 21-05-2009 01:43 1123636

Расположить в последовательности числа в порядке убывания частоты встречаемости
 
Решено

pva 21-05-2009 07:21 1123675

Код:

#include <iostream>
#include <map>
#include <iterator>
using namespace std;

int main()
{
// контейнер для подсчёта
  map<int,unsigned> sym_count;
// контейнер для сортировки
  map<unsigned,int> sym_sorted;


// 1. берём числа из потока и считаем их повторения
  for(istream_iterator<int,char> first(cin), last; first!=last; ++first)
  {
    ++sym_count[*first];
  }

// 2. сортируем (пользуемся тем, что map всегда содержит сортированный список)
  for(map<int,unsigned>::iterator first(sym_count.begin()), last(sym_count.end()); first!=last; ++first)
  {
    sym_sorted[first->second] = first->first;
  }

// 3. выводим на экран
  for(map<unsigned,int>::reverse_iterator first(sym_sorted.rbegin()), last(sym_sorted.rend()); first!=last; ++first)
  {
    cout << first->second << ": " << first->first << "\n";
  }
}

Есть ещё варианты с явной сортировкой, то есть скопировать загруженный map в list и отсортировать его по критерию.
Пример с использованием шаблонов перебора
Код:

// достоинство - модульность (причём иерархическая)
string output_format(const pair<unsigned,int>& a);

struct calc_sym_count_t
{
  map<int,unsigned> _count;

  void operator()(const int& n)
  {
    ++_count[n];
  }
};

struct sort_sym_t
{
  map<unsigned,int> _sorted;

  void operator()(const pair<int,unsigned>& _count)
  {
    _sorted[_count.second] = _count.first;
  }
};

string output_format(const pair<unsigned,int>& a)
{
  ostringstream os;
  os << setw(10) << a.second << ": " << a.first;
  return os.str();
}

int main()
{
  calc_sym_count_t calc_sym_count;
  sort_sym_t sort_sym;

  // достоинство - лёгкость чтения:
  // для каждого от начала до конца посчитать кол-во символов
  for_each(istream_iterator<int,char>(cin), istream_iterator<int,char>(), calc_sym_count);
  // для каждого от начала до конца кол-ва символов сортировать
  for_each(calc_sym_count._count.begin(), calc_sym_count._count.end(), sort_sym);
  // преобразовать сортированные символы в поток вывода с использованием формата
  transform(sort_sym._sorted.rbegin(), sort_sym._sorted.rend(), ostream_iterator<string,char>(cout, "\n"), output_format_t);
}


pva 22-05-2009 07:36 1124675

Цитата:

Цитата .::.DIMA.::.
это нужно написать на assembler »

как вариант - откомпилируй и дизассемблируй

virus-smal 24-05-2009 16:32 1126371

Если кому на Delphi надо то вот:
Код:

var a:array[1..2,0..9] of integer;
c:char;
i,k,j:integer;

begin

for i:=0 to 9 do begin
  a[1,i]:=i;
  a[2,i]:=0;
  end;
 read(c);
 while c<>'.' do begin
 k:=ord(c)-ord('0');
 a[2,k]:=a[2,k]+1;
 read(c);
 end;
 for i:=0 to 8  do
 for j:=i+1  to 9 do
 if a[2,i]>a[2,j] then  begin
 k:=a[2,i];
 a[2,i]:=a[2,j];
 a[2,j]:=k;
 k:=a[1,i];
 a[1,i]:=a[1,j];
 a[1,j]:=k;
 end;
 for i:=0 to 9  do
 if a[2,i]<>0 then  write(a[1,i]);
 readln;
 readln;
end.



Время: 05:16.

Время: 05:16.
© OSzone.net 2001-