2016年南京理工大学计算机复试机试题

第一题 求阶乘

题目描述:给出一个数n(1<=n<=13),求出它的阶乘。
输入描述:输入只有一个整数n。
输出描述:对于输入的n,求出它的阶乘并输出。
分析:求阶乘对大家来说应该很简单,可以用递归或者循环来做,本题中要求的n介于1到13之间,大家都知道int类型的数值能够表示的数值大小很有限,那在本题中能否用int类型表示计算结果呢,我们通过以下代码进行测试:

#include
int main()
{
	int m=1,n;
	for(int i=1;;i++)
		{
			n=m;
			m*=i;
			if(n!=m/i)//当乘上i再除i之后的结果,与之前不一致时,可说明发生了溢出现象 
			{
				printf("int类型最大能够表示%d的阶乘",i-1);
				break;
			}	
		}
 } 

运行结果如下所示:
2016年南京理工大学计算机复试机试题_第1张图片
运行结果说明这个看似简单的题存在一个陷阱,如果考虑不周,即使简单的题也拿不到分,所以我们要使用long long类型保存及计算结果,其代码如下:

#include
long long fun(int n) //使用递归求阶乘,也可使用循环 
{
	if(n==0||n==1)
		return 1;
	else
		return n*fun(n-1);
		
}
int main()
{
	int n;
	scanf("%d",&n); 
	printf("%lld\n",fun(n));
		
}

第二题 括号匹配

题目描述:苗苗今天刚刚学会使用括号,不过他分不清小括号,中括号,大括号和尖括号,不知道怎么使用这些括号,请帮助他判断括号使用是否正确。
输入描述:输入六行只包含’<’,’(’,’{’,’[’,’>’,’)’,’}’,’]'的字符串(长度不超过10000)
输出描述:对应每行输入,如果输入的字符串中的括号正确匹配则输出yes,否则输出no。
分析:括号匹配大家并不陌生,在学习栈的应用时应该举过这个例子,因此本题就采用C++ STL中的stack(如果没有学习过c++,准备机试也不要紧张,c++兼容c,c++中提供了很多库函数,大大简化了编程的难度,当要使用时,查询一些基本用法即可。)本题的实现代码如下:

#include
#include
#include
#define N 10001
using namespace std;
int main()
{
	int loop=6;
	char str[N];
	while(loop--)
	{
		stack s;
		scanf("%s",str);
		int flag=1;
		for(int i=0;i')
			{
				if(s.empty()||s.top()!='<')
				{
					flag=0;
					break;
				}
				else{
					s.pop();
				}
			}
		}
		if(flag&&s.empty())//当且仅当flag不为空时,且此时栈为空,则匹配才算成功,否则都算失败 
			printf("yes\n");
		else
			printf("no\n");		
	}
 } 

第三题 架线方案

题目描述:电信公司要在多个城市之间架设通信线路,有些城市之间可以架设,而有些由于条件限制不可以架设,可以架设线路的城市之间的架设线路成本为c,现有n个城市,求出使这n个城市互相联通最节省的费用。
输入描述:输入的第一行是一个正整数k(1<=k<=100),表示有k组测试数据。每组测试数据第一行是两个整数n,m(2<=n<=100,1<=m<=n*(n-1)/2),n表示城市数,m表示可以架设的线路数,接下来m行每行三个整数a,b,c,表示编号为a的城市与编号为b的城市之间架设通信线路的成本为c。
输出描述:对于每组测试数据,给出一个整数,表示最节省的费用。(若不存在则输出-1)
输入格式样例
1
3 3
0 1 1
2 1 2
2 0 1
输出格式样例
2
分析:最小生成树问题有两种办法解决,在本题中使用kruskal算法,按照成本将路线进行排序,然后从小到大逐一添加到集合中,如加入之后形成回路,则丢弃该边,否则保留,直至加到存在n-1条边。
实现代码如下:

#include
#include
#define N  500000
using namespace std;
int Tree[N],n;
struct line{ //用于存储路线 
	int start;
	int end;
	int cost;
}lines[N];
bool cmp(line a,line b) 
{
	if(a.cost

第四题 搬箱子

题目描述:华华要给厂里进一批新箱子共n个(n<=500),编号为1到n,用一个正整数ai(1<=ai<=10000)(1<=i<=n)来表示编号为i的箱子的高度。现在华华要按照编号从小到大的顺序选出m个箱子运到厂房,要确保编号大的箱子比编号小的箱子高。也就是对于任意的i 输入描述:第一行是正整数n,表示n个箱子,第二行a1,a2…an分别表示编号为i的箱子的高度。
输出描述:输出华华最多可以搬运的箱子个数。
输入格式样例
7
1 7 3 5 9 4 8
输出格式样例
4

#include
#define N 501
int main() 
{
	int dp[N],a[N];
	int n,max=0;
	scanf("%d",&n);
	for(int i=1;i<=n;i++)
	{
		scanf("%d",&a[i]);
		dp[i]=1;
	}	
	for(int i=1;i<=n;i++)
	{
		for(int j=i-1;j>=1;j--)
		{
			if(a[j]max) 
			max=dp[i];
	}
	printf("%d",max);	
}

第五题 树的高度

题目描述:树是一种特殊的图结构,有根树是一个有固定根的树。现在给定一棵有根树,编程求出树中所有节点到指定的根节点最远距离,
输入描述:第一行是两个整数N,M(1<=N<=10000,1<=M<=N),表示数的顶点数和根节点的编号,接下来N-1行,每行两个整数u,v(1<=u,v<=N),表示编号为u的节点和编号为v的节点间有一条边。
输出描述:输出距离根节点最远的点到根的距离。
输入格式样例
5 5
1 2
1 4
1 5
2 3
输出格式样例
3

#include
#define N 10001
int data[N][N]={0},visited[N]={0};
void DFS(int start,int &max,int current,int n)
{
	if(current>max)
		{
			max=current;
		}
	bool find=false;
	for(int i=1;i<=n;i++)
	{
		if(data[start][i]&&!visited[i])
		{
			find=true;
			visited[i]=1;
			DFS(i,max,current+1,n);
			visited[i]=0;
		}
	 } 
	 if(find==false)
	 	return;
	
}
int main()
{
	int n,root,a,b;
	scanf("%d %d",&n,&root);
	for(int i=0;i

第六题 女士优先

题目描述:午餐时间还未到,饥饿的程序员们早早就在食堂门口排队了。假设现在的队列是这样的:MFM。从左往右,第一位是男程序员(Male),第二位是女程序员(Female),第三位是一位男程序员。但是男程序员不会让女程序员排在他们后面,于是就会发生这样的情况:只要一位男程序员发现自己后面是一位女程序员,他就会和这位女程序员交换位置,这样的交换需要消耗一秒。当然,在同一秒内可能会有多位男程序员和自己后面的女程序员交换位置。现在,请问最少要消耗多长时间,队伍不再变动。
输入描述:输入一个字符串,仅包含‘M’和‘F’两种字母,表示当前的排队情况。(最左边表示队伍头,字符串长度<=100000)
输出描述:队伍不再变动的时间。
输入格式样例
MMFF
输出格式样例
3

#include
#include
#include
#define N 100010
using namespace std;
bool NeedChange(string str)
{
	int index=str.find("MF");
	if(index<0||index>=str.length()-1)
		return false;
	else
		return true;
} 
void change(string &str)
{
	for(int i=0;i>str;
	{
		int count=0;
		while(NeedChange(str))
		{
			count++;
			change(str);
		}
		printf("%d",count);
		
	}
	
}

你可能感兴趣的:(C++)