题目描述
有一个长度为n(n<=100)的数列,该数列定义为从2开始的递增有序偶数(公差为2的等差数列),现在要求你按照顺序每m个数求出一个平均值,如果最后不足m个,则以实际数量求平均值。编程输出该平均值序列。
输入
输入数据有多组,每组占一行,包含两个正整数n和m,n和m的含义如上所述。
输出
对于每组输入数据,输出一个平均值序列,每组输出占一行
样例输入复制
3 2 4 2
样例输出复制
3 6 3 7
(1)首先我们需要知道当n大于等于m的情况,然后考虑n小于m的情况。
(2)定义一个数组来保存这个递增有序偶数列,然后将这个数组不断按m划分,不足m的按实际数量划分。
举一个n为9,m为4的例子来分析这题。
手绘图,请体谅,电脑不太好做这种图像。
规律已经出来了,直接上代码。
#include <stdio.h>
#include <stdlib.h>
void average(int n,int m)
{
int data[n],sum=0,ave=0,index=n;
for(int i=0; i<n; i++)
{
data[i]=2+2*i;
}
if(n>=m) //如果n大于等于m
{
for(int i=m-1; i<n; i=i+m) //尾循环
{
for(int j=i-(m-1); j<=i; j++) //头循环
{
sum=sum+data[j]; //元素相加
}
ave=sum/m; //求平均值
printf("%d ",ave);
sum=0;
if(i+m>n-1) //判断下一次循环的尾是否还在数组范围内
{ //如果不在,按实际数量求平均值
index=i+1; //把下一个头赋值为最后一个尾然后加1
}
}
if(index<=n-1) //如果这个头加1没有超出数组范围
{
for(int i=index; i<n; i++)
{
sum=sum+data[i];
}
ave=sum/(n-index); //按实际数量求平均值
printf("%d ",ave);
}
printf("\n");
}
else if(n<m) //如果n小于m
{
for(int i=0;i<n;i++)
{
sum=sum+data[i];
}
ave=sum/n;
printf("%d\n",ave);
}
}
int main()
{
int n,m;
while(scanf("%d %d",&n,&m)!=EOF)
{
average(n,m);
}
return 0;
}