题目:
有一个长度为n(n<=100)的数列,该数列定义为从2开始的递增有序偶数,现在要求你按照顺序每m个数求出一个平均值,如果最后不足m个,则以实际数量求平均值。编程输出该平均值序列。
Input
输入数据有多组,每组占一行,包含两个正整数n和m,n和m的含义如上所述。
Output
对于每组输入数据,输出一个平均值序列,每组输出占一行。
Sample Input
3 2
4 2
Sample Output
3 6
3 7
Author
lcy
方法一(比较繁琐,变量过多,过程不够简洁):
思路:先将n个递增的数储存在数组arr[ ]中,再求每m个数的和,再输出平均值。而如果n%m不为零,再另行计算最后不足m个数的平均值。
#include<stdio.h>
void main()
{
int n,m,i,k,j,erwai,he;
int arr[100]={0.0};
while(~scanf("%d %d",&n,&m))
{
arr[0]=2;
k=0; //用k表示第几个数组元素
erwai=0;
for(i=1;i<n;i++) //用数组储存n个递增的数
{
arr[i]=arr[i-1]+2;
}
for(i=0;i<(n/m);i++) //求满足m个数为一组的数的平均值
{
he=0;
for(j=0;j<m;j++)
{
he+=arr[k];
k++;
}
if(i==0)
printf("%d",he/m);
else
printf(" %d",he/m);
}
if(n%m!=0) //求不足m个数的平均值
{
j=n; //后面需要求n%m来计算数量,所以用j
for(i=0;i<n%m;i++)
{
erwai+=arr[j-1];
j--;
}
printf(" %d",erwai/(n%m));
}
printf("\n");
}
}
方法二:
思路:该题不用数组储存数列,而是当an随着循环不断叠加时,求取每个an的和(he),每满m个数便输出平均值并清零he。
#include<stdio.h>
void main()
{
int n,m,i,he,an;
while(~scanf("%d %d",&n,&m))
{
an=0;
he=0;
for(i=1;i<=n;i++)
{
an+=2;
he=he+an;
if(i%m==0) //每满m个数输出一次平均值
{
if(i==m)
printf("%d",he/m);
else
printf(" %d",he/m);
he=0; //每输出一次平均值 就清零每m项的和
}
}
if(he!=0) //如果和不为零,意味着需要额外考虑不足m个数的情况
printf(" %d",he/(n%m)); // n%m表示最后剩余几个数
printf("\n");
}
}
方法三:
思路:该题借等差数列前n项和公式,求得首项、公差皆为2的数列的Sn=n*(n+1),则可用Sn-Sn-m依次求得每m个数的和,再输出平均值,而不足m个数的,可用Sn-Sn-n%m求得。
#include<stdio.h>
void main()
{
int n,m,he=0,i;
while(~scanf("%d %d",&n,&m))
{
for(i=1;i<=n;i++)
{
if(i%m==0)
{
he=i*(i+1)-(i-m)*(i-m+1); //利用等差数列求和公式
if(i==m)
printf("%d",he/m);
else
printf(" %d",he/m);
}
}
if(n%m!=0) //不足m个数的情况
{
he=n*(n+1)-(n-n%m)*(n-n%m+1);
printf(" %d",he/(n%m));
}
printf("\n");
}
}