题目描述
有一个长度为 n(n<=100)的数列, 该数列定义为从2开始的递增有序偶数, 现在要求你按照顺序每 m个数求出一个平均值, 如果最后不足 m个, 则以实际数量求平均值。编程输出该平均值序列。
输入
输入数据有多组, 每组占一行, 包含两个正整数 n和 m, n和 m的含义如上所述。
输出
对于每组输入数据, 输出一个平均值序列, 每组输出占一行。
样例输入
3 2
4 2
样例输出
3 6
3 7
代码(C语言):
#include<stdio.h>
int main(){
int n,m;
int i,j,sum;
int avg;
// 序列为 2 4 6 8 10 12 14 ...
while(scanf("%d %d",&n,&m)!=EOF){ //输入n(序列总长度),m: 每m个数取一个平均值
if(n>=1 && n<=100 && m>=1){ //判断n,m范围, 注意:题目没说m<n, 如 输入3 4 是可以的
int a=n/m,b=n%m; //a表示有多少个m长度的段, b表示最后余下的不足m长度的一段数据,其长度为b
//两种段长度不一样,分两种情况讨论
for (i=1;i<=m*a;i=i+m){ //a个段,循环a次,累加量m
sum=0; //计算每一段平均数前初始化sum=0
for(j=i;j<=i+m-1;j++){ //起始号i的这个m段,m个数据求和,算平均值
sum=sum+2*j;
}
avg= sum/m;
printf("%d ",avg);
}
//当n<m时,上面一段 a=n/m =0,上面代码不生效,只计算一段b长度段的平均值
if(b!=0){ //对不足m的最后一段算平均值
sum=0;
for(i=n-b+1;i<=n;i++){ //b个数据求和,计算平均值
sum=sum+2*i;
}
avg= sum/b;
printf("%d ",avg);
}
printf("\n");
}
}
return 0;
}