HDU--2015

时间:2023-03-08 20:58:20

偶数求和

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)

Total Submission(s): 56836    Accepted Submission(s): 24787

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
Author
lcy

#include <iostream>
#include <stdlib.h> using namespace std; int main()
{
int n, m, a[110], num, sum, result, b[110];
memset(a,0,110);
memset(b,0,110);
while (cin >> n>> m)
{
sum = 0;
int flag = 0;
num = 2;
for (int i=0; i<n; i++)
{
a[i] = num;
num = num+ 2;
}
if (n / m !=0)
{
int t = n/m ;
int k = 0;
int p = m;
for ( ; t>0; t--)
{
sum = 0;
for (int j=k;j <p; j++)
{
sum = sum + a[j];
}
result = sum / m;
b[flag] = result;
flag= flag +1;
k = k+m;
p = p+m;
}
cout << b[0];
if (flag > 1)
{
for (int i=1; i<flag; i++)
{
cout <<" "<<b[i];
}
}
if (n%m !=0)
{
sum = 0;
int p= n/m;
for (int j=p*m; j<n; j++)
{
sum = sum +a[j];
}
result = sum /(n-p*m);
cout << " "<< result ;
}
cout << endl;
}
else
{
for (int j=0; j<n; j++)
{
sum = sum +a[j];
}
result = sum /n;
cout << result <<endl;
}
}
return 0;
}

这道题把我坑了~最后不足m个则以实际数量求平均值,可是我理解成为了去求所有数的平均值了。然后就是虽然我把这道题目解答出来了 ,但是很明显这道题我的做法有缺陷,如果当n取值超过数组保留范围的时候,我就不能用数组了,再就是代码量明显多了。。借此看了discuss里面觉得比较优秀的一段代码,因此附上如下


#include <stdio.h>

int main()
{
int n,m;
while (scanf("%d %d",&n,&m)!=EOF)
{
int i,count = 0,tmp = 0,sum = 0;
for (i=1;i<=n;i++)
{
count++; tmp += 2;
sum += tmp;
if (i == n)
{
printf("%d\n",sum / count);
}
else if (count == m)
{
printf("%d ",sum / m);
count = 0; sum =0;
}
}
}
return 0;
}