/* La llei d'Hondt per al repartiment d'escons a partir dels nombres de vots Joan Aranès Clua http://www.xtec.cat/~jaranes jaranes@xtec.cat 19/02/2002 Procediment: El primer escó s'assigna al partit més votat, els altres s'assignen, pas a pas, al partit que li correspongui el valor més gran de la següent funció: vots[P]/(esc[P]+1) aplicada en cada pas del repartiment a cada un dels partits {P} tenint en compte el nombre de vots nominal. Cas que a dos partits els correspongui el mateix valor per aquesta funció, l'escó s'assigna al partit més votat; i, cas que els partits que tinguin el mateix valor per a la funció vots[P]/(esc[P]+1 i també tinguin també el mateix nombre de vots (cosa molt poc probable), l'assignació es fa per sorteig la primera vegada que es doni l'empat, i per a la resta d'empats, l'escó s'assigna alternativament. Exemple: Suposem tres partits: A, B i C amb els següents nombres de vots: 200, 100, 80 Es volen repartir 4 escons. Vegem, pas a pas el procés: A B C escons ... 200/(1+0)=200 100/(1+0) 80/(1+0) A ->1; B->0; C->0 200/(1+1)=100 100/(1+0) 80/(1+0) A-> 1+1=2; B->0; C->0 200/(2+1)~67 100/(1+0) 80/(1+0) A-> 2; B->1; C->0 200/(2+1)~67 100/(1+1)=50 80/(1+0) A-> 2; B->1; C->1 En aquest cas, correspondrien dos escons a A, un a B i un a C */ #include <stdio.h> #define N_ESC 20 // nombre d’escons #define N_PAR 30 // nombre de partits int nou_esc(int *, int *, int); void main(void){ int ct; int esc[N_PAR]={0}; // esc{[N_ESC]= nomb. d’esc per partit int vots[N_PAR]; // vots[N_PAR]= nomb. de vots per partit int np,ne; //np = nombre de partits, ne = nombre d'escons printf("nombre de partits = "); scanf("%d", &np); printf("nombre d'escons = "); scanf("%d", &ne); printf("Tecleja el nombre de vots de cada partit.\n"); for (ct=0; ct<np; ++ct) { printf("\nPartit %d: ", ct+1); scanf("%d", &vots[ct]); } for(ct=0; ct<ne; ++ct) esc[nou_esc(vots, esc, np)]++; for (ct=0; ct<np; ++ct) printf("\nEl partit %d ha obtingut %d escons.", ct+1, esc[ct]); } int nou_esc( int vots[], int esc[], int np) { int imax=0, ct; int max=0; int maxvots=0; // nombre màxim de vots for (ct=0;ct<np;++ct) {if (maxvots<vots[ct]) maxvots=vots[ct];} for (ct=0; ct<np; ++ct) { if( max<=(vots[ct]/(esc[ct]+1)) ) { if (max<(vots[ct]/(esc[ct]+1))) { max=vots[ct]/(esc[ct]+1); imax=ct; } if (max==(vots[ct]/(esc[ct]+1))) { if (maxvots<vots[ct]) {imax=ct;} } } } return imax; }
Un blog con cuestiones, ejercicios, problemas, aplicaciones y comentarios relacionados con los contenidos de Matemáticas del segundo curso de Bachillerato en las modalidades de Ciencias y Tecnología
martes, 1 de octubre de 2002
Implementación de la ley d'Hondt. Un ejercicio de programación en C/C++
Suscribirse a:
Enviar comentarios (Atom)
No hay comentarios:
Publicar un comentario
Gracias por tus comentarios