算法竞赛入门经典 第三章 习题
习题3-1 分数统计:输入一些学生的分数,哪个分数出现的次数最多?如果有多个并列,从小到大输出。
任务1:分数均为不超过100的非负整数
1 //习题3.1,分数统计(stat) 2 #define LOCAL 3 #include<stdio.h> 4 #include<string.h> 5 #ifndef MAX 6 #define MAX 100+1 7 #endif 8 9 int a[MAX]; 10 int main(){ 11 12 //从本地读取文件(重定向),不用每次都进行数据输入 13 #ifdef LOCAL 14 freopen("data.txt","r",stdin); 15 #endif 16 17 memset(a,0,sizeof(a)); 18 19 int degree; 20 while(scanf("%d",°ree) == 1){ 21 a[degree] += 1; 22 } 23 24 int i,max = a[0]; 25 int tmp[MAX]; 26 memset(tmp,0,sizeof(tmp)); 27 28 for(i=1; i <= MAX; i++){ 29 if(a[i] > max){ 30 max = a[i]; 31 } 32 } 33 int j = 0; 34 for(i = 0; i < MAX; i++){ 35 if(a[i] == max){ 36 tmp[j] = i; 37 j++; 38 } 39 } 40 41 for (i = 0; i < j; ++i) 42 { 43 printf("%d\n",tmp[i]); 44 } 45 return 0; 46 }
任务2:分数均为不超过100的非负实数,但最多保留两位小数
1 //习题3.1,分数统计(stat) 2 #define LOCAL 3 #include<stdio.h> 4 #include<string.h> 5 #include<math.h> 6 #ifndef MAX 7 #define MAX 10000+1 8 #endif 9 10 int a[MAX]; 11 int main(){ 12 //从本地读取文件(重定向),不用每次都进行数据输入 13 #ifdef LOCAL 14 freopen("data.txt","r",stdin); 15 #endif 16 17 memset(a,0,sizeof(a)); 18 19 double degree; 20 while(scanf("%lf",°ree) == 1){ 21 //直接double强制转化为int会出现问题,如4.9999999999,应为5,但会是4.9 22 //使用floor进行四舍五入可以解决这个问题 23 double m = degree * 100; 24 int n = floor(m+0.5); 25 a[n] += 1; 26 } 27 28 int i,max = a[0]; 29 int tmp[MAX]; 30 memset(tmp,0,sizeof(tmp)); 31 32 for(i=1; i <= MAX; i++){ 33 if(a[i] > max){ 34 max = a[i]; 35 } 36 } 37 38 int j = 0; 39 for(i = 0; i < MAX; i++){ 40 if(a[i] == max){ 41 tmp[j] = i; 42 j++; 43 } 44 } 45 46 for (i = 0; i < j; ++i) 47 { 48 double temp = tmp[i]*0.01; 49 printf("%.2f\n",temp); 50 } 51 52 return 0; 53 }
习题3-2:单词的长度(word):输入若干个单词,输出它们的平均长度。单词只包含大写字母和小写字母,用一个或多个空格隔开
1 #define LOCAL 2 #include<stdio.h> 3 #include<ctype.h> 4 #define MAX 1000 5 char a[MAX]; 6 7 int main(){ 8 #ifdef LOCAL 9 freopen("data.txt","r",stdin); 10 #endif 11 12 char c; 13 int charNum = 0,wordNum = 1; 14 int i = 0; 15 16 while(scanf("%c",&c)==1){ 17 18 if(c == '\n'){ 19 break; 20 }else{ 21 a[i] = c; 22 i++; 23 } 24 } 25 26 int j; 27 for(j = 0; j < i; j++){ 28 if(a[j] == ' '&& isalpha(a[j+1])){ 29 wordNum++; 30 } 31 if(isalpha(a[j])){ 32 charNum++; 33 } 34 } 35 36 double avg = (1.0)*charNum/wordNum; 37 printf("%d %d\n", charNum,wordNum); 38 printf("%.2lf\n",avg); 39 return 0; 40 }