如何求N个数的平均值注意N个数直接相加肯定会溢出

cnyfk 2013-05-25 09:04:02
请问在C++中如何求N个数的平均值?这N个数直接相加肯定会溢出因为INT类型只有32位有什么好的算法可以求吗?a
...全文
883 13 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
lm_whales 2013-06-13
  • 打赏
  • 举报
回复
//上面有点错误,改正一下: //只用整数求平均数: int get_avg(const int array[], int size,int *remain) { int avg = 0,re= 0; int i; // assert(size>0); if(size<=0) {if(remain) *remain=0; return 0;} for (i = 0; i < size; ++i) { avg += a[i] / size ; re += a[i] % size; avg += re /size; re %= size; } if(remain) *remain =re; return avg; }
lm_whales 2013-06-13
  • 打赏
  • 举报
回复
//只用整数求平均数:
int get_avg(const int array[], int size,int *remain)
{
    int avg = 0,re= 0;
    int i;
    //
    assert(size>0);
       
    if(size<=0)
           {if(remain) *remain=0; return 0;}
 
    for (i = 0; i < size; ++i)
    {     
        avg += a[i]/ size ;
        re  += a[i] % size;
        avg += re %size;
     }
     if(remain)
        *remain =re;
    return avg;
}
窗外蓝天 2013-05-26
  • 打赏
  • 举报
回复
啊,平均数还可以这样算,学习了
lsjfdjoijvtghu 2013-05-26
  • 打赏
  • 举报
回复
#include"stdio.h"
int main()
{int a[]={14532755,999932456,4748364,32123,32434,32333,32111,-32555};
    double aver;
    aver=(double)(a[0]+a[1])/2;
    for(int i=2;i<8;i++)
    {aver=(double)(a[i]+i*aver)/(i+1);
    
    }
    printf("%lf",aver);
    
}
猛奔的tester 2013-05-26
  • 打赏
  • 举报
回复
每个值除以N相加,所有余数相加除以N再和前者相加
hello_world000 2013-05-26
  • 打赏
  • 举报
回复

double get_avg(const int array[], int size)
{
    double avg = 0;
    int i;
    
    for (i = 0; i < size; ++i)
    {
        double tmp = array[i] - avg;
        avg += (tmp / (i + 1));
    }
    
    return avg;
}
baichi4141 2013-05-26
  • 打赏
  • 举报
回复
每个数都减去一个数再相加,记住减去的那个数是多少就行 例如1111111111,1111111112, 1111111113, 1111111114, 1111111115,5个数直接相加必定溢出,但全都减去1111111110,得到总和15,平均值为3,再加上1111111110等于1111111113 而且减去的数是可调的,如果初始值没选好依然导致溢出就调整一下,很简单的
Athenacle_ 2013-05-26
  • 打赏
  • 举报
回复
如果已知n,可以把数直接先除n,再相加
mujiok2003 2013-05-25
  • 打赏
  • 举报
回复
溢出在+,-,*,/都会有,直接big integer??
sniffer12345 2013-05-25
  • 打赏
  • 举报
回复
汗 a1+a2+...a2/n = (a1 + a2 + .. ak) / n + (ak + .. an)/n
Carl_CCC 2013-05-25
  • 打赏
  • 举报
回复
如果要特别精确的话,就要用字符串表示的大整数了, 如果不需要特别精确的话 用double加下面的公式还是比较接近结果的 假设前n个数值的平均值为V(n),第n+1个数为T, 则前n+1个数的平均值为: V(n+1) = (T - V(n)) / (n + 1) + V(n)
大尾巴猫 2013-05-25
  • 打赏
  • 举报
回复
先排序,然后把(最大值+最小值)/2,得到一个数字M,数组中所有的元素进行-=M的操作,然后从一头一尾开始往中间累加,得到的值/数组中元素个数,在加上M,就是平均数。 这个方法也许可以使溢出的可能降低。
hugett 2013-05-25
  • 打赏
  • 举报
回复
用longlong或者用double。。

65,186

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧