【算法竞赛入门经典】【第三章】课后习题(第一部分)

课后习题第三波来了,到第三章之后代码之类的稍微变长了一些,所以我把这一章的答案分为几部分。这一章重点是字符串的处理,对于字符串问题,通常只要细心就没有问题了,下面不多说了直接上详解。

习题3-1 分数统计(stat)

任务1:这个比较简单就直接上代码了:

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#define MAXN 100 + 10
int cmp(const void*a,const void*b){
	return *(int*)a - *(int*)b;
}

int main() {
	int i,j,n,max,p;
	int Stu[MAXN],a[MAXN];
	memset(a,0,sizeof(a));
	scanf("%d",&n);
	for(i = 0; i < n; i++){
		scanf("%d",&p);
		a[p]++;
	}
	max=a[0];
	for( i = 1; i < MAXN; i++){
		if(a[i]>=max){
			max=a[i];
		}
	}
	for( i = 0, j = 0; i < MAXN; i++){
		if(a[i]==max){
			Stu[j++] = i;
		}
	}
	qsort(Stu,j,sizeof(Stu[0]),cmp);
	for( i = 0; i < j; i++){
		if(i) printf(" ");
		printf("%d",Stu[i]);
	}
	printf("\n");
	return 0;
}

任务2:这个相对任务1难度就加大许多了,其中这一题,在使用 qsort 函数时还有一个小细节要注意,就是在return 时,对于double型的要使用 三元运算符,如果按照之前的处理方法会造成错误,错误来自于浮点数的误差。这一题我的处理方法与第一题类似,但是要与第一题整数类似,就必须做出一点牺牲,然而我牺牲了内存。代码如下:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define MAXN 10000 + 100

int cmp(const void*a,const void*b){
	return *(double*)a>*(double*)b?1:-1;
}

int main() {
	int i,j,a[MAXN],n,max,temp;
	double p,Stu[101];
	memset(a,0,sizeof(a));
	scanf("%d",&n);
	for(i = 0; i < n; i++){
		scanf("%lf",&p);
		temp = 100*p;
		a[temp]++;
	}
	max=a[0];
	for( i = 1; i < MAXN; i++){
		if(a[i] > max){
			max = a[i];
		}
	}
	for( i = 0, j = 0; i < MAXN; i++){
		if(a[i]==max){
			Stu[j++] = (double)i/100;
		}
	}
	qsort(Stu,j,sizeof(Stu[0]),cmp);
	for( i = 0; i < j; i++){
		if(i) printf(" ");
		printf("%.2lf",Stu[i]);
	}
	printf("\n");
	return 0;
}

习题3-2 单词长度(word)

这一题比较简单,只需要注意 数单词 数的时候小心一些就好了

#include <stdio.h>
#include <ctype.h>
#define MAXN 10000 + 100
char str[MAXN];
int main(){
	int i,sum = 0,count = 0;	//count用于记录空格数,sum用于记录字母的总数
	gets(str);
	if(str[0]!=' ')
		count = 1;
	for(i = 0; str[i]!='\0';i++){
		if(str[i]==' '&&isalpha(str[i+1]))
			count++;
		if(isalpha(str[i]))
			sum++;
	}
	printf("count = %d,sum = %d\n",count,sum);
	printf("%.2lf\n",1.0*sum/count);
    return 0;
}

习题3-3 乘积的末三位(product)

这一题的分两步,第一步将含有大小写字母的字符串舍弃,第二部分将纯数字的字符串转化为数字进行运算。这样一来问题就清晰了,代码如下:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int isNum(char *a,int len){
	int i;
	for( i = 0; i < len; i++){
		if(a[i]<'0'||a[i]>'9')
			return 0;
	}
	return 1;
}

int main(){
	char str[20];
	int i,n,p,tmp;	//n表示输入整数的个数,p表示那些整数乘积的后三位
	while(scanf("%d",&n) == 1){
		p = 1;
		for(i = 0; i < n; i++){
			scanf("%s",str);
			getchar();
			if(isNum(str,strlen(str))){
				tmp = atoi(str);
				p *= tmp;
				p %= 1000;
			}
		}
		printf("%03d\n",p);
	}
    return 0;
}

对于【第三章】的其他习题,会在后面的文章继续

(如有错误,欢迎指正)

时间: 2024-08-25 13:26:52

【算法竞赛入门经典】【第三章】课后习题(第一部分)的相关文章

《算法竞赛入门经典第二版》 P35 习题2-4 子序列的和(subsequence)

/* <算法竞赛入门经典第二版> P35 习题2-4: 输入两个正整数 n < m < 10^6,输出 (1/n)^2 + 1/(n+1)^2 +……+ 1/m^2,保留5位小数. 输入包含多组数据,结束标志为 m=n=0. 有错欢迎指出^_^ */ #include<stdio.h> int main() { int m,n,i,j=1; while(scanf("%d%d",&m,&n) != EOF) { double sum

算法竞赛入门经典_第二章:循环结构程序设计_上机练习_MyAnswer

习题2-1 位数 输入一个不超过109的正整数,输出它的位数.例如12735的位数是5.请不要使用任何数学函数,只用四则运算和循环语句实现. #include<stdio.h> int main(void) { int n; int digit = 0; scanf("%d",&n); while(n) { n = n / 10; digit++; } printf("%d\n", digit); return 0; } 习题2-2 水仙花数 输

《算法竞赛入门经典》第二章 2.1

程序2-1 1 #include<stdio.h> 2 #include<math.h> 3 int main() 4 { 5 int n; 6 scanf("%d",&n); 7 for(int i=1;i<=n;i++) 8 { 9 printf("%d\n",i); 10 } 11 return 0; 12 13 } 程序2-2 1 #include<stdio.h> 2 #include<math.h&

《算法竞赛入门经典》第二章 2.2

程序2-4 1 #include<stdio.h> 2 #include<math.h> 3 int main() 4 { 5 int n, count = 0; 6 scanf("%d",&n); 7 while(n>1) 8 { 9 if(n % 2 ==1) n = 3*n +1; 10 else n/=2; 11 count++; 12 } 13 printf("%d\n",count); 14 return 0; 15

《算法竞赛入门经典》第二章 2.3

程序2-7 略去 程序2-8 1 #define LOCAL 2 #include<stdio.h> 3 #define INF 100000000 4 int main() 5 { 6 #ifdef LOCAL 7 freopen("data.in","r",stdin); 8 freopen("data.out","w",stdout); 9 #endif // LOCAL 10 int x, n = 0, m

算法竞赛入门经典(三)

例题3-1 开灯问题 题目:有n盏灯,编号为1~n.第1个人把所有灯打开,第2个人按下所有编号为2的倍数的开关(这些灯将被关掉),第3个人按下所有编号为3的倍数的开关(其中关掉的灯将被打开,开着的灯将被关闭),依此类推.一共k个人,问最后有那些灯开着?输入:n和k,输出开着的灯编号.k<=n<=1000. 分析:用sign[1],sign[2],...,sign[n]表示编号为1,2,3,...,n的灯是否开着.模拟这些操作即可: 源码: #include<stdio.h> #in

算法竞赛入门经典 第四章

[√ ] UVA1339 古老的密码 Ancient Cipher [√ ] UVA489 刽子手的游戏 Hangman Judge [√ ] UVA133 救济金发放 The Dole Queue [√ ] UVA213 信息解码 Message Decoding [√ ] UVA512 追踪电子表格中的单元格 Spreadsheet Tracking [√ ] UVA12412 师兄帮帮忙 A Typical Homework (a.k.a Shi Xiong Bang Bang Mang)

【算法竞赛入门经典】【第三章】课后习题(第二部分)

自从蓝桥杯之后,都没写博客了.今天将之前第三章还差的一部分习题答案补上. 3-4整数相加 这一题题目有提示,说选择合适的输入方式,即可简化问题.刚开始没想到cin,结果还用字符串来做,多亏别人提醒我一下,我才想起cin.惭愧啊.. #include <iostream> using namespace std; int main() { int a,b; char op; while(cin>>a>>op>>b){ switch(op){ case '+':

算法竞赛入门经典+挑战编程+USACO

下面给出的题目共计560道,去掉重复的也有近500题,作为ACMer Training Step1,用1年到1年半年时间完成.打牢基础,厚积薄发.   一.UVaOJ http://uva.onlinejudge.org  西班牙Valladolid大学的程序在线评测系统,是历史最悠久.最著名的OJ.   二.<算法竞赛入门经典> 刘汝佳  (UVaOJ  351道题)  以下部分内容摘自:http://sdkdacm.5d6d.com/thread-6-1-1.html   "AO

(Step1-500题)UVaOJ+算法竞赛入门经典+挑战编程+USACO

下面给出的题目共计560道,去掉重复的也有近500题,作为ACMer Training Step1,用1年到1年半年时间完成.打牢基础,厚积薄发. 一.UVaOJ http://uva.onlinejudge.org 西班牙Valladolid大学的程序在线评测系统,是历史最悠久.最著名的OJ. 二.<算法竞赛入门经典> 刘汝佳  (UVaOJ  351道题)  以下部分内容摘自:http://sdkdacm.5d6d.com/thread-6-1-1.html “AOAPC I”是刘汝佳(大