1. 程式人生 > >資訊學奧賽一本通(C++版)第一部分 C++語言 第四章 迴圈結構的程式設計

資訊學奧賽一本通(C++版)第一部分 C++語言 第四章 迴圈結構的程式設計

第四章 迴圈結構的程式設計

第一節 for語句

T1059 : 求平均年齡

時間限制: 1000 ms 記憶體限制: 65536 KB

【題目描述】

  班上有學生若干名,給出每名學生的年齡(整數),求班上所有學生的平均年齡,保留到小數點後兩位。

【輸入】

  第一行有一個整數n(1n100)n(1≤n≤100),表示學生的人數。其後nn行每行有11個整數,表示每個學生的年齡,取值為15152525

【輸出】

  輸出一行,該行包含一個浮點數,為要求的平均年齡,保留到小數點後兩位。

【輸入樣例】

2
18
17

【輸出樣例】

17.5

【答案&程式碼】

#include
<cstdio>
//以上為標頭檔案 int n,temp; //以上為全域性變數 int main(void){ register int i,sum=0; //以上為暫存器變數 scanf("%d",&n); for(i=1;i<=n;++i) scanf("%d",&temp), sum+=temp; printf("%.2f\n",(double)sum/n); return 0; }

T1060 : 均值

時間限制: 1000 ms 記憶體限制: 65536 KB

【題目描述】

  給出一組樣本資料,包含nn個浮點數,計算其均值,精確到小數點後4

4位。

【輸入】

  輸入有兩行,第一行包含一個整數nnnn小於100100),代表樣本容量;第二行包含nn個絕對值不超過10001000的浮點數,代表各個樣本資料。

【輸出】

  輸出一行,包含一個浮點數,表示均值,精確到小數點後44位。

【輸入樣例】

2
1.0 3.0

【輸出樣例】

2.0000

【答案&程式碼】

#include<cstdio>
//以上為標頭檔案

int n;
double temp;
//以上為全域性變數

int main(void){
	register int i;
	register double sum=0;
	//以上為暫存器變數
	scanf("%d",&
n); for(i=1;i<=n;++i) scanf("%lf",&temp), sum+=temp; printf("%.4f\n",sum/n); return 0; }

T1061 : 求整數的和與均值

時間限制: 1000 ms 記憶體限制: 65536 KB

【題目描述】

  讀入n(1n10000)n(1≤n≤10000)個整數,求它們的和與均值。

【輸入】

  輸入第一行是一個整數nn,表示有nn個整數。

  第2n+12-n+1行每行包含11個整數。每個整數的絕對值均不超過1000010000

【輸出】

  輸出一行,先輸出和,再輸出平均值(保留到小數點後55位),兩個數間用單個空格分隔。

【輸入樣例】

4
344
222
343
222

【輸出樣例】

1131 282.75000

【答案&程式碼】

#include<cstdio>
//以上為標頭檔案

int n,temp;
//以上為全域性變數

int main(void){
	register int i,sum=0;
	//以上為暫存器變數
	scanf("%d",&n);
	for(i=1;i<=n;++i)
		scanf("%d",&temp),
		sum+=temp;
	printf("%d %.5f\n",sum,(double)sum/n);
	return 0;
}

T1062 : 最高的分數

時間限制: 1000 ms 記憶體限制: 65536 KB

【題目描述】

  孫老師講授的《計算概論》這門課期中考試剛剛結束,他想知道考試中取得的最高分數。因為人數比較多,他覺得這件事情交給計算機來做比較方便。你能幫孫老師解決這個問題嗎?

【輸入】

  輸入兩行,第一行為整數n(1n&lt;100)n(1≤n&lt;100),表示參加這次考試的人數.第二行是這nn個學生的成績,相鄰兩個數之間用單個空格隔開。所有成績均為00100100之間的整數。

【輸出】

  輸出一個整數,即最高的成績。

【輸入樣例】

5
85 78 90 99 60

【輸出樣例】

99

【答案&程式碼】

#include<cstdio>
//以上為標頭檔案

int n,temp;
//以上為全域性變數

int main(void){
	register int i,MAX=-1;
	//以上為暫存器變數
	scanf("%d",&n);
	for(i=1;i<=n;++i){
		scanf("%d",&temp);
		if(temp>MAX)
			MAX=temp;
	}
	printf("%d\n",MAX);
	return 0;
}

T1063 : 最大跨度值

時間限制: 1000 ms 記憶體限制: 65536 KB

【題目描述】

  給定一個長度為nn的非負整數序列,請計算序列的最大跨度值(最大跨度值==最大值減去最小值)。

【輸入】

  一共22行,第一行為序列的個數n(1n1000)n(1≤n≤1000),第二行為序列的nn個不超過10001000的非負整數,整數之間以一個空格分隔。

【輸出】

  輸出一行,表示序列的最大跨度值。

【輸入樣例】

6
3 0 8 7 5 9

【輸出樣例】

9

【答案&程式碼】

#include<cstdio>
//以上為標頭檔案

int n,temp;
//以上為全域性變數

int main(void){
	register int i,MAX=-1,MIN=1001;
	//以上為暫存器變數
	scanf("%d",&n);
	for(i=1;i<=n;++i){
		scanf("%d",&temp);
		if(temp>MAX)
			MAX=temp;
		if(temp<MIN)
			MIN=temp;
	}
	printf("%d\n",MAX-MIN);
	return 0;
}

T1064 : 奧運獎牌計數

時間限制: 1000 ms 記憶體限制: 65536 KB

【題目描述】

  20082008年北京奧運會,AA國的運動員參與了nn天的決賽專案(1n17)(1≤n≤17)。現在要統計一下AA國所獲得的金、銀、銅牌數目及總獎牌數。輸入第11行是AA國參與決賽專案的天數nn,其後nn行,每一行是該國某一天獲得的金、銀、銅牌數目。輸出44個整數,為AA國所獲得的金、銀、銅牌總數及總獎牌數。

【輸入】

  輸入n+1n+1行,第11行是AA國參與決賽專案的天數nn,其後nn行,每一行是該國某一天獲得的金、銀、銅牌數目,以一個空格分開。

【輸出】

  輸出11行,包括44個整數,為AA國所獲得的金、銀、銅牌總數及總獎牌數,以一個空格分開。

【輸入樣例】

3
1 0 3
3 1 0
0 3 0

【輸出樣例】

4 4 3 11

【答案&程式碼】

#include<cstdio>
//以上為標頭檔案

int n,sum[4],temp[4];
//以上為全域性變數

int main(void){
	register int i,j;
	//以上為暫存器變數
	scanf("%d",&n);
	for(i=1;i<=n;++i)
		for(j=1;j<=3;++j)
			scanf("%d",&temp[j]),
			sum[j]+=temp[j];
	for(i=1;i<=3;++i)
		printf("%d ",sum[i]);
	printf("%d\n",sum[1]+sum[2]+sum[3]);
	return 0;
}

T1065 : 奇數求和

時間限制: 1000 ms 記憶體限制: 65536 KB

【題目描述】

  計算非負整數mmnn(包括mmnn)之間的所有奇數的和,其中,mm不大於nn,且nn不大於300300。例如m=3,n=12m=3,n=12,其和則為:3+5+7+9+11=353+5+7+9+11=35

【輸入】

  兩個數mmnn,兩個數以一個空格分開,其中0mn3000≤m≤n≤300

【輸出】

  輸出一行,包含一個整數,表示mmnn(包括mmnn)之間的所有奇數的和。

【輸入樣例】

7 15

【輸出樣例】

55

【答案&程式碼】

#include<cstdio>
//以上為標頭檔案

int m,n;
//以上為全域性變數

int main(void){
	register int sum=0;
	//以上為暫存器變數
	scanf("%d%d",&m,&n);
	for(;m<=n;++m)
		if(m&1)
			sum+=m;
	printf("%d\n",sum);
	return 0;
}

T1066 : 滿足條件的數累加

時間限制: 1000 ms 記憶體限制: 65536 KB

【題目描述】

  將正整數mmnn之間(包括mmnn)能被1717整除的數累加,其中0&lt;m&lt;n&lt;10000&lt;m&lt;n&lt;1000

【輸入】

  一行,包含兩個整數mmnn,其間,以一個空格間隔。

【輸出】

  輸出一行,包行一個整數,表示累加的結果。

【輸入樣例】

50 85

【輸出樣例】

204

【答案&程式碼】

#include<cstdio>
//以上為標頭檔案

int m,n;
//以上為全域性變數

int main(void){
	register int sum=0;
	//以上為暫存器變數
	scanf("%d%d",&m,&n);
	for(;m<=n;++m)
		if(m%17==0)
			sum+=m;
	printf("%d\n",sum);
	return 0;
}

T1067 : 整數的個數

時間限制: 1000 ms 記憶體限制: 65536 KB

【題目描述】

  給定k(1&lt;k&lt;100)k(1&lt;k&lt;100)個正整數,其中每個數都是大於等於11,小於等於1010的數。寫程式計算給定的kk個正整數中,1,5,101,5,10出現的次數。

【輸入】

  輸入有兩行:第一行包含一個正整數kk,第二行包含kk個正整數,每兩個正整數用一個空格分開。

【輸出】

  輸出有三行,第一行為11出現的次數,,第二行為55出現的次數,第三行為1010出現的次數。

【輸入樣例】

5
1 5 8 10 5

【輸出樣例】

1
2
1

【答案&程式碼】

#include<stdio.h>
int main(void){
	int k;
	scanf("%d",&k);
	int sum[3]={0};
	for(int i=0;i<k;i++){
		int temp;
		scanf("%d",&temp);
		if(temp==1)
			sum[0]+=1;
		else if(temp==5)
			sum[1]+=1;
		else if(temp==10)
			sum[2]+=1;
	}
	printf