杭州电子科技大学ACM2015—偶数求和—解题思路(accept)
偶数求和
- *Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 150965 Accepted Submission(s): 61680
*
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
Code
#include<stdio.h>
int main(){
int n,m,idx1,avg,idx2,div,rem;
while(~scanf("%d%d",&n,&m))
{
int arr[n];//偶数数组
arr[0] = 2;//从2开始
for(int i = 1;i < n;i++)
{
arr[i] = arr[i-1] + 2;//填充偶数数组
}
div = n / m; //取出除数
rem = n % m; //取出余数
int array[div];//定义平均数数列,即目标数组
if(m % 2 == 0)//如果m为偶数,则第一次取m个数的平均值等于中间两位数的和除以2,即为平均值数组的第一位。
{
idx2 = m / 2 - 1;//要注意下标和第几位数的差别
avg = (arr[idx2] + arr[idx2 + 1]) / 2; //平均值序列第一位
}
else //如果m为奇数,则第一次取m个数的平均值等于中间那位数,即为平均值数组的第一位。
{
idx1 = m / 2;
avg = arr[idx1];//平均值序列第一位
}
array[0] = avg;//从首位开始
for(int j = 1; j < div;j++)
{
array[j] = array[j-1] + arr[m-1]; //填充平均数数列
}
if(rem != 0)//如果余数不为0
{
int sum = 0; //定义不足m个数的那部分数的和
for(int k = n - rem;k < n;k++)
{
sum += arr[k];//求出他们的平均值
}
array[div] = sum / rem;//最后一位
for(int o = 0; o < div;o++)
{
printf("%d ",array[o]);
}
printf("%d\n",array[div]);//为了确保输出格式正确,单独输出最后一位数和回车
}
else//如果余数为0,则没有剩下的数
{
for(int l = 0;l < div-1;l++)
{
printf("%d ",array[l]);
}
printf("%d\n",array[div-1]);//为了确保输出格式正确,单独输出最后一位数和回车
}
}
return 0;
}