-
Liczba
- Obliczasz sumę odchyleń (
double
) Sum
- Znajdujesz maksymalne odchylenie
Max
w pozycji Pos
- Obliczasz
Delta=Liczba*Max/Sum
- Zmniejszasz/Zwiększasz pozycje
Pos
o Delta
- Zmniejszasz
Liczba
o Delta
- Jeżeli
Liczba>0
powtarzasz od punktu 2
#include <iostream>
#include <cmath>
using namespace std;
void show(int tb[],size_t size)
{
for(size_t i=0;i<size;++i) cout<<(","+!i)<<tb[i];
cout<<endl;
}
void divide(int tb[],size_t size,int ext)
{
show(tb,size);
while(ext>0)
{
double avg=0;
for(size_t i=0;i<size;++i) avg+=tb[i];
avg/=size;
size_t imax=0;
double dif=0,vmax=0;
for(size_t i=0;i<size;++i)
{
double tmp=fabs(avg-tb[i]);
dif+=tmp;
if((!i)||(tmp>vmax))
{
vmax=tmp;
imax=i;
}
}
int chg=(int)round(max(1.0,dif*ext/(size*size)));
ext-=chg;
if(tb[imax]>avg) tb[imax]-=chg; else tb[imax]+=chg;
show(tb,size);
}
}
int main()
{
int tb[]={10,5,3};
divide(tb,sizeof(tb)/sizeof(*tb),7);
return 0;
}
https://ideone.com/nt6bIc