杭州电子科技大学ACM2015-偶数求和-解题思路(accept)

杭州电子科技大学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;
}

猜你喜欢

转载自blog.csdn.net/qq_45236472/article/details/107316598