hdu 2015 偶數求和(陣列,呼叫函式,c語言)
阿新 • • 發佈:2018-11-16
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;//返回算出來的平均值
}
筆記:
- 說實話,我想用二維陣列a[ ][m]做,那樣最開始每組長度為 m便已經確定,只要呼叫行位移就可以完成