#include <stdio.h>
size_t down_rate(double *data,size_t len,unsigned rate_in,unsigned rate_out)
{
double sum=0;
size_t index=0,out=0,in=0;
while(in<len)
{
sum+=data[in++];
index+=rate_out;
if(index>=rate_in)
{
data[out++]=sum*rate_out/index;
index-=rate_in;
sum=0;
}
}
return out;
}
int main()
{
double data[]={1,2,3,4,5,6,7,8,9,10};
const size_t len=sizeof(data)/sizeof(*data);
size_t i,nlen;
nlen=down_rate(data,len,2,1);
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CgpzaXplX3QgZG93bl9yYXRlKGRvdWJsZSAqZGF0YSxzaXplX3QgbGVuLHVuc2lnbmVkIHJhdGVfaW4sdW5zaWduZWQgcmF0ZV9vdXQpCiAgewogICBkb3VibGUgc3VtPTA7CiAgIHNpemVfdCBpbmRleD0wLG91dD0wLGluPTA7CiAgIHdoaWxlKGluPGxlbikKICAgICB7CiAgICAgIHN1bSs9ZGF0YVtpbisrXTsKICAgICAgaW5kZXgrPXJhdGVfb3V0OyAKICAgICAgaWYoaW5kZXg+PXJhdGVfaW4pCiAgICAgICAgewogICAgICAgICBkYXRhW291dCsrXT1zdW0qcmF0ZV9vdXQvaW5kZXg7CiAgICAgICAgIGluZGV4LT1yYXRlX2luOwogICAgICAgICBzdW09MDsKICAgICAgICB9CiAgICAgfSAgICAKICAgcmV0dXJuIG91dDsKICB9CgppbnQgbWFpbigpCiAgewogICBkb3VibGUgZGF0YVtdPXsxLDIsMyw0LDUsNiw3LDgsOSwxMH07CiAgIGNvbnN0IHNpemVfdCBsZW49c2l6ZW9mKGRhdGEpL3NpemVvZigqZGF0YSk7CiAgIHNpemVfdCBpLG5sZW47CiAgIGZvcihpPTA7aTxsZW47KytpKSBwcmludGYoIiU2LjFsZiIsZGF0YVtpXSk7IHByaW50ZigiXG4iKTsKICAgbmxlbj1kb3duX3JhdGUoZGF0YSxsZW4sMiwxKTsKICAgZm9yKGk9MDtpPG5sZW47KytpKSBwcmludGYoIiU2LjFsZiIsZGF0YVtpXSk7IHByaW50ZigiXG4iKTsKICAgcmV0dXJuIDA7CiAgfQ==