首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

请问平均数算法

2013-07-08 
请教平均数算法输入i个x,求其平均数avg。算法1:x+ (x-avg)/i算法2:sum+x, avgsum/i要求写一段代码证明

请教平均数算法
输入i个x,求其平均数avg。
算法1:x+= (x-avg)/i;
算法2:sum+=x, avg=sum/i;
要求写一段代码证明即使sum不溢出,算法1也比2好。
谢过各位高人啦先~
[解决办法]
我看不出有什么区别. 我给你做了个测试.


#include<stdio.h>
#include<time.h>

int main()
{
int i ;
double x ,sum = 0,avg = 0;
srand(time(NULL));
for(i = 0; i < 1000000 ; i++)
{
x = rand()%10+1;
sum += x;
}
avg = sum/i;
printf("%lf\n",avg);
printf("time use:%lf\n",(double)clock()/CLOCKS_PER_SEC);
}




还有这个


#include<stdio.h>
#include<time.h>
int main()
{
double sum = 0,avg = 0;
double x;
int i;
srand(time(NULL));
for(i = 0 ; i < 1000000; i++)
{
x = rand()%10+1;
avg += (x-avg)/(i+1);
}
printf("%lf\n",avg);
printf("time use:%lf\n",(double)clock()/CLOCKS_PER_SEC);

}




在百万级,不考虑是否溢出, 没看出第一个算法有好在哪里. 除了人在计算的时候,少计算点之外,计算机的特点就是计算.排除溢出,这两个算法差别真心不大.
[解决办法]

#include <stdlib.h>
#include <stdio.h>

int main()
{
    static double data[1000000];
    double sum, avg, check_value;
    int i;
    int n = sizeof(data)/sizeof(data[0]);
    
    avg = 0;
    for( i = 0; i < n; ++ i)
    {
        avg += ( data[i] - avg) / (i + 1);
    }
   
    check_value = 0;
    for( i = 0; i < n; ++ i)
    {
        check_value = check_value + ( data[i] - avg );


    }
    printf("\navg += (x[i] - avb) / i:\tavg = %g\t check_value = %g", avg, check_value );
    
       for( i = 0; i < n; ++ i )
    {
        data[i] = 1.3;
    }
   
    sum = 0;
    for( i = 0; i < n; ++ i)
    {
        sum += data[i];
    }
    avg = sum / n;
    
    check_value = 0;
    for( i = 0; i < n; ++ i)
    {
        check_value = check_value + ( data[i] - avg );
    }
    printf("\n avg = sum / N: \tavg = %g\t check_value = %g", avg, check_value );
 
    getchar();
}



将每个数据与avg相减的差累加,最终结果应该为0,但方法二的结果不是0,而是 -2.44718e-005。

热点排行