1. 程式人生 > >hdu 2015 偶數求和(陣列,呼叫函式,c語言)

hdu 2015 偶數求和(陣列,呼叫函式,c語言)

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便已經確定,只要呼叫行位移就可以完成