解题思路:
大概的解题思路分为两段进行计算:
列举一个2的等差数列,2 4 6 8 10 12 14 16 18
举例:输入n=9,m=4;
第一段:那么我们先要计算的是长度为9的数列,分别加了几次的和以及平均值分别是什么?再记录计算完之后还剩下几个?
比如:在这次计算中 2+4+6+8=20 ,10+12+14+16=52。 剩下一个18,并用一个s来作为标记剩下几个(每计算一组m,就用s-m来记录剩下的数字剩下几个,前提是s=n)
则sum= 20/4=5 和 52/4=13(注意数列是为2的等差数列)
即 avg=sum/m
第二段:最后再把剩下的数字s全部加起来再除以s就可以得到后面一段的平均数了
注意事项:
计算完一组输入的数据之后要把所有的值进行复原!!!否则上一组的数据将会在下一组中出现!!!
如果你的计算结果不是很正确,你可以多对其他的数据进行测试,比如测试s、t、sum、avg的值,多次测试就能得到想要的结果啦。
参考代码:
#include int main() { int n,m,i,j,sum1=0,avg1=0,t=2,sum2=0,avg2=0,s=0; while(scanf("%d%d",&n,&m)!=EOF) { s=n; //这里标记是因为后面需要计算完之后剩余的数字为多少 for(i=0;i<n/2;i++) { if(s>=m && s>=0) //s要大于m才能筛选出m范围的数字,s>=0这个条件别忘记,否则可能为负数 { for(sum1=0,j=1;j<=m;j++) //把m范围内的数字全加起来 { sum1=sum1+t; t=t+2; //等差数列,公差为2 } avg1=sum1/m; //求其平均 printf("%d ",avg1); //输出平均值 s=s-m; //每次计算完都会少m个数字 } } if(s!=0) //表示还剩下s个数字 { for(i=1;i<=s;i++) //也是把剩下的s全部加起来 { sum2=sum2+t; t=t+2; //这里的t值还是上一循环条件基础上的t值 } avg2=sum2/s; //剩下s个当然就是除以s啦 printf("%d\n",avg2); sum1=avg1=sum2=avg2=0; //这里注意要重新赋值,否则上一个数字测试的数据还会存在 t=2; s=n; } if(s==0) //如果上面不剩数字(例如:4和2),那么我们直接重新赋值,准备下一个输入的计算 { sum1=avg1=sum2=avg2=0; t=2; s=n; } } return 0; }
0.0分
7 人评分