杭电oj 2015 偶数求和

题目:

有一个长度为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

方法一(比较繁琐,变量过多,过程不够简洁):

思路:先将n个递增的数储存在数组arr[ ]中,再求每m个数的和,再输出平均值。而如果n%m不为零,再另行计算最后不足m个数的平均值。

#include<stdio.h>
void main()
{
	int n,m,i,k,j,erwai,he;
	int arr[100]={0.0};
	while(~scanf("%d %d",&n,&m))
	{
		arr[0]=2;
		k=0;     //用k表示第几个数组元素
		erwai=0;
		for(i=1;i<n;i++)  //用数组储存n个递增的数
		{
			arr[i]=arr[i-1]+2;
		}
		for(i=0;i<(n/m);i++)   //求满足m个数为一组的数的平均值
		{
			he=0;
			for(j=0;j<m;j++)
			{
				he+=arr[k];
				k++;
			}
			if(i==0)
				printf("%d",he/m);
			else
				printf(" %d",he/m);
		}
		if(n%m!=0)   //求不足m个数的平均值
		{
			j=n;     //后面需要求n%m来计算数量,所以用j
			for(i=0;i<n%m;i++)
			{
				erwai+=arr[j-1];
				j--;
			}
			printf(" %d",erwai/(n%m));
		}
		printf("\n");
	}
}

方法二:

思路:该题不用数组储存数列,而是当an随着循环不断叠加时,求取每个an的和(he),每满m个数便输出平均值并清零he。

#include<stdio.h>
void main()
{
	int n,m,i,he,an;
	while(~scanf("%d %d",&n,&m))
	{
		an=0;
		he=0;
		for(i=1;i<=n;i++)
		{
			an+=2;
			he=he+an;
			if(i%m==0)  //每满m个数输出一次平均值
			{
				if(i==m)
					printf("%d",he/m);
				else
					printf(" %d",he/m);
				he=0;    //每输出一次平均值 就清零每m项的和
			}
		}
		if(he!=0)    //如果和不为零,意味着需要额外考虑不足m个数的情况
			printf(" %d",he/(n%m));    // n%m表示最后剩余几个数
		printf("\n");
	}
}

方法三:

思路:该题借等差数列前n项和公式,求得首项、公差皆为2的数列的Sn=n*(n+1),则可用Sn-Sn-m依次求得每m个数的和,再输出平均值,而不足m个数的,可用Sn-Sn-n%m求得。

#include<stdio.h>
void main()
{
	int n,m,he=0,i;
	while(~scanf("%d %d",&n,&m))
	{
		for(i=1;i<=n;i++)
		{
			if(i%m==0)
			{
				he=i*(i+1)-(i-m)*(i-m+1);   //利用等差数列求和公式
				if(i==m)
					printf("%d",he/m);
				else
					printf(" %d",he/m);
			}
		}
		if(n%m!=0)  //不足m个数的情况
		{
			he=n*(n+1)-(n-n%m)*(n-n%m+1);
			printf(" %d",he/(n%m));
		}
		printf("\n");
	}
}

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值