hdu 2015 偶数求和(数组,调用函数,c语言)

版权声明:本文为博主原创,未经博主允许不得转载 https://blog.csdn.net/Sherry_Yue/article/details/83628070

hdu 2015 偶数求和

点击做题网站链接

题目描述

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

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

题目难点

1. 使用一维数组(其实二维数组做可能简单一些)
2. 调用函数
3. 要求输出是一个数字空一个数字,但要注意在第一个数字之前不能输出空格,在最后一个数字之后也不能输出空格。这个在我之前的《hdu 2010 水仙花数(c语言)》中记过笔记,具体可以参考链接https://blog.csdn.net/Sherry_Yue/article/details/83216082

问题解答

#include <stdio.h>
int aver(int[],int,int);//声明调用的求平均数的函数

int main()
{
    int n,m,a[101];//开一个足够大的数组储存长度为 n,从2开始递增的偶数
    while(scanf("%d",&n)!=EOF)
    {
        scanf("%d",&m);
        for(int i=0,j=2;i<n;i++)//赋值,从2开始递增
        {
            a[i]=j;
            j+=2;//递增的偶数
        }

        int b;double ave;
        //这边采用分两部分求平均,第一部分是每m个数求出一个平均值,第二部分是如果最后不足m个,则以实际数量求平均值
        for(b=0;b<n/m;++b)//每数m个数为一组,则求第一部分每组的平均值
        {
            ave=aver(a,b*m,m);//每组长度为 m的数据,它的首下标都是 b*m(穷举法边可以发现规律)
            if(b!=n/m-1) printf("%0.0lf ",ave);//为了控制输出空格的问题
            else printf("%0.0lf",ave);//为了控制输出空格的问题
        }
        if(n-b*m>0)//求第二部分,最后一组数不足m个,则求实际的平均值
        {
            ave=aver(a,b*m,n-b*m);//每组长度为 n-b*m的数据的首下标还是b*m
            printf(" %0.0lf",ave);//注意输出空格的问题
        }
        printf("\n");//在所有平均值都输出完毕之后再换行
    }
    return 0;
}

int aver(int a[],int first_index,int len)//第一个参数表示传的是哪个数组,
                //第二、三个参数表示要从哪个数开始(first_index第一个数的下标)往后的长度为len的一组数
{
    int sum=0;double ave;//一般定义平均值都是double(怕小数被和谐掉),
    //但这边其实这边题目是若干个偶数求平均,所以不会出现小数,用int没问题
    for(int i=first_index;i<first_index+len;++i)//i从首下标开始数,数len个数
    {
        sum+=a[i];//每数一次就求一次和
    }
    ave=(double)sum/len;//算这组数的平均值
    return ave;//返回算出来的平均值
}

笔记:

  1. 说实话,我想用二维数组a[ ][m]做,那样最开始每组长度为 m便已经确定,只要调用行位移就可以完成

猜你喜欢

转载自blog.csdn.net/Sherry_Yue/article/details/83628070