偶数求和
有一个长度为n(n<=100)的数列,该数列定义为从2开始的递增有序偶数,现在要求你按照顺序每m个数求出一个平均值,如果最后不足m个,则以实际数量求平均值。编程输出该平均值序列。
Input
输入数据有多组,每组占一行,包含两个正整数n和m,n和m的含义如上所述。
Output
对于每组输入数据,输出一个平均值序列,每组输出占一行。
Sample Input
3 2
4 2
Sample Output
3 6
3 7
注:本题第二次看的时候依然不会做,要好好的多看几次!!!目前暂未找到/看不懂优化写法,希望下次自己能写出来/找到。
本题算法思想:
关键是判断n%m是否为0;然后是双重循环计算每个平均值,特别是最后几个数量不到m的数的平均值;最后注意一下每次求完平均值后,初始化一下和s。
代码:
#include<iostream>
#include<math.h>
#include<stdio.h>
#include<algorithm>
#include<memory.h>
#include<stdlib.h>
using namespace std;
int main()
{
int n,m,ave,i,j,k,s,yu;
while(scanf("%d %d",&n,&m)!=EOF)
{
yu=n%m;
j=0;
if(yu==0) //余数为0的情况
{
for(i=1;i<=n;i+=m)
{
s=0; //要把s=0放到第一层循环里面,因为每次计算平均数之前都要初始化s
for(k=0;k<m;k++)
{
j=j+2; //偶数列的表示
s+=j;
}
ave=s/m;
if(i==1)
printf("%d",ave);
else
printf(" %d",ave);
}
printf("\n");
}
else
{
for(i=1;i<=n-yu;i+=m) //n-yu前面的元素个数是m的倍数
{
s=0;
for(k=0;k<m;k++)
{
j=j+2;
s+=j;
}
ave=s/m;
printf("%d ",ave);
}
s=0; //注意初始化一下s
for(i=1;i<=yu;i++)
{
j=j+2; //j一直是累加的,并未被初始化
s+=j;
}
ave=s/yu;
printf("%d\n",ave);
}
}
return 0;
}