解题思路:
大概的解题思路分为两段进行计算:
列举一个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就可以得到后面一段的平均数了
1 | <br> |
注意事项:
计算完一组输入的数据之后要把所有的值进行复原!!!否则上一组的数据将会在下一组中出现!!!
如果你的计算结果不是很正确,你可以多对其他的数据进行测试,比如测试s、t、sum、avg的值,多次测试就能得到想要的结果啦。
参考代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 | #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; } |
1 | <br> |
9.7 分
4 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复