有一个长度为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>
#include<math.h>
int main()
{
int n, m, i, j, sum, flag = 0, t, k;
while(scanf("%d%d", &n, &m) != EOF)
{
flag = 0;
t = 0;
k = 1;
sum = 0;
if(n % m == 0)
t = n / m;
else
t = (n/m) + 1;
if(n < m)
for( i = 1; i <= n; )
{
sum = 0;
//k = 1;
if(n < m)
for(j = 1; j <= n; j++)
{
sum += (2*i);
i++;
}
printf("%d\n", sum/n);
}
else
{
for(i = 1; i <= n; )
{
sum = 0;
//k = 1;
if(k == t && (n%m) != 0)
{
for(j = 1; j <= n%m; j++)
{
sum += (2*i);
i++;
}
printf("%d\n", sum / (n%m));
}
else
{
for(j = 1; j <= m; j++)
{
sum += (2*i);
i++;
}
k++;
if(k > t)
printf("%d\n", sum / m);
else
printf("%d ", sum / m);
}
}
}
}
return 0;
}
以上是一开始写的代码,显然很多语句是写重复了的。
下面是经过优化后的代码。
# include<stdio.h>
#include<math.h>
int main()
{
int n, m, i, j, sum, flag = 0, group, k;
while(scanf("%d%d", &n, &m) != EOF)
{
group = 0;
k = 1;///k一开始就初始化为1组,不可能为0组的。k是计数器。
sum = 0;
if(n % m == 0)
group = n / m;
else
group = (n/m) + 1;
for(i = 1; i <= n; )
{
sum = 0;///sum初始化为0.
if(k == group && (n%m) != 0)///group是组数。m是加和个数。
m = n%m;
for(j = 1; j <= m; j++)///主干算法在这里。
{
sum += (2*i);
i++;
}
k++;
if(k > group)
printf("%d\n", sum / m);
else
printf("%d ", sum / m);
}
}
return 0;
}