algorytm.org

Implementacja w C/C++



Baza Wiedzy
wersja offline serwisu przeznaczona na urządzenia z systemem Android
Darowizny
darowiznaWspomóż rozwój serwisu
Nagłówki RSS
Artykuły
Implementacje
Komentarze
Forum
Bookmarki






Sonda
Implementacji w jakim języku programowania poszukujesz?

Metoda d'Hondt'a - Implementacja w C/C++
Ocena użytkownikóww: *****  / 5
SłabyŚwietny
Nadesłany przez Tomasz Lubiński, 01 marca 2006 01:00
Kod przedstawiony poniżej przedstawia główną część rozwiązania problemu.
Pobierz pełne rozwiązanie.

Jeżeli nie odpowiada Ci sposób formatowania kodu przez autora skorzystaj z pretty printer'a i dostosuj go automatycznie do siebie.

dhondt_c.c:
//
// Metoda d'Hondt'a przydzialu mandatow
// www.algorytm.org
// (c)2006 Tomasz Lubinski
//


#include "stdio.h"

float calcNewValue(int votes, int mandates)
{
   return (votes*1.0) / (mandates + 1.0);
}

int main()
{
   int mandates[100];
   int votes[100];
   float calcTab[100];
   float max;
   int groupCount, mandatesCount, i, j, maxInd;

   //get all data
   printf("Podaj liczbe partii (max. 100)\n");
   scanf("%d", &groupCount);
   
   printf("Podaj liczbe mandatow\n");   
   scanf("%d", &mandatesCount);
   
   for (i=0; i<groupCount; i++)
   {
      printf("Podaj liczbe glosow na partie %d\n", i+1);   
      scanf("%d", &votes[i]);   
   }
   
   //clear number of mandates
   for (i=0; i<groupCount; i++)
   {
      mandates[i] = 0;
   }
   
   //calculate mandates (d'Hondt)
   for (i=0; i<groupCount; i++)
   {
      calcTab[i] = votes[i];
   }
   for (i=0; i<mandatesCount; i++)
   {
      //find max 
      max = -1;
      for (j=0; j<groupCount; j++)
      {
         if (max<calcTab[j])
         {
            max = calcTab[j];
            maxInd = j;
         }
      }
      
      //give mandate for party with max
      mandates[maxInd]++;
      calcTab[maxInd] = calcNewValue(votes[maxInd], mandates[maxInd]);
   }
   
   //present results
   for (i=0; i<groupCount; i++)
   {
      printf("Partia %d ma %d mandatow\n", i+1, mandates[i]);   
   }   
   
   return 0;
}
Komentarze
photo
0 # andrzej1973 2015-11-13 14:04
witam, pomocne, polecam!!!
Odpowiedz | Odpowiedz z cytatem | Cytować
photo
0 # RJB 2016-02-25 16:08
Program jest wg. mnie błędny.

Rozważmy przykład z 3 partiami, walczącymi o 4 mandaty. Niech liczby oddanych głosów wynoszą 333, 222, 111. Ewidentnie pierwsze trzy mandaty dostaną partia 3, partia 2 i znowu partia 3. Natomiast w przydziale mandatu czwartego jest remis, ponieważ 333/3 == 222/2 == 111. Podany tu program przydziela czwarty mandat partii 1, natomiast większość wariantów metody D'Hondta w przypadku równości ilorazów daje pierwszeństwo tej partii, która zdobyła najwięcej głosów - a więc w tym przykładzie, partii 3. Tak jest np. w definicji metody D'Hondta przyjętej w polskiej ordynacji wyborczej. Tak więc ten program dla podanego przykładu daje przydział [1, 1, 2], podczas gdy właściwa odpowiedź to [0, 1, 3].
Odpowiedz | Odpowiedz z cytatem | Cytować
photo
+1 # Tomasz Lubiński 2019-12-05 06:31
Tak jak napisano w artykule - sposoby rozstrzygania sytuacji gdy kilka partii uzyskało takie same współczynniki mogą być różne.
By przykładowy program rozwiązywał taką sytuację jak napisałeś wystarczy warunek:
...
if (max<calcTab[j])
...
zamienić na:
...
if (max < calcTab[j] || (max == calcTab[j] && votes[maxInd] < votes[j]))
...
Odpowiedz | Odpowiedz z cytatem | Cytować
Dodaj komentarz