这道题看起来不复杂,但做起来还是挺费工夫的。里面要用很多的循环结构,很容易在些小地方出错。我就是因为那些小问题而搞了很久。
Problem Description
有一个长度为n(n<=100)的数列,该数列定义为从2开始的递增有序偶数,现在要求你按照顺序每m个数求出一个平均值,如果最后不足m个,则以实际数量求平均值。编程输出该平均值序列。
Input
输入数据有多组,每组占一行,包含两个正整数n和m,n和m的含义如上所述。
Output
对于每组输入数据,输出一个平均值序列,每组输出占一行。
Sample Input
3 2
4 2
Sample Output
3 6
3 7
#include <stdio.h>
main()
{
int a[100]={0},b[50]={0};
int n,m,i,j,time,sum;
while(scanf("%d%d",&n,&m)!=EOF)
{
if(n<=100)
{
a[0]=2;
for(i=0;i<n-1;i++)/*这里我刚开始时是用n的,后来检查了很久才发现(用n的话会多定义一个数,让后面的计算出错)*/
{
a[i+1]=a[i]+2;//输入有序偶数序列
}
time=n/m;
if(n%m!=0)
{
time=time+1;//最后不足m项时的计算次数
}
for(j=0;j<time;j++)//计算time次每m项的平均值
{
sum=0;
for(i=0;i+j*m<(j+1)*m;i++)
{
sum=sum+a[i+j*m];//计算每m项的平均值 ,这里要特别注意每项数,否则会赋错值的位置
}
if(n%m!=0)
{
if(j==time-1)
b[j]=sum/(n-(time-1)*m);//不足m项时的平均值
else b[j]=sum/m;
}
else b[j]=sum/m;//每m项的平均值
}
for(j=0;j<time;j++)
{
if(j>=1)
{
printf(" ");
}
printf("%d",b[j]);//输出每m项的平均值
}
printf("\n");
for(i=0;i<n;i++)//清除序列的数据 ,避免影响后面的运算
{
a[i]=0;
}
}
}
}
这道题比较麻烦的就是他的循环结构太多了,容易出错。以后,在碰到类似的题时要多注意这方面的问题。