西安交通大学915计算机软件基础往年真题编程题答案

06年真题编程题答案

1 编写函数,用冒泡排序法或选择排序法对输入的 100个整数按从小到大的顺序排列;

#include <stdio.h>
//冒泡排序算法 
void bubblesort(int A[], int n) { //
	bool sorted = false; //整体排序标志,首先假定尚未排序
	int m = n;
	while (!sorted) { 
		sorted = true; //假定已经排序
		for (int i = 1; i < n; i++) { //自左向右逐对检查弼前范围A[0, n)内癿各相邻元素
			if (A[i - 1] > A[i]) { //一旦A[i - 1]不A[i]逆序,则
				int temp = A[i - 1];
				A[i-1] = A[i];
				A[i] = temp;
				
				sorted = false; //因整体排序丌能保证,需要清除排序标志
			}
		}
		n--; //至此末元素必然就位,故可以缩短待排序序列癿有效长度
	}
	for(int i = 0; i < m; i++){
		printf(" %d",A[i]);
	}
} 
//程序运行主函数 
int main(){
	int A[] = {2,9,3,6,1,17,43,21,32,5,78,54}; 
	int n = 12;
	bubblesort(A,n);
} 

2、采用递归法,编写实现n!的函数;

#include <stdio.h>
int fun(int n)
{
	if(n==0)return 0;
	if(n==1)return 1;
	if(n==2)return 2;
	if(n>=3)return fun(n-1)*n;
}
int main()
{
	int n,result;
	printf("输入整数n:"); 
	scanf("%d",&n);
	result=fun(n);
	printf("%d!计算结果为:%d",n,result);
	return 0;
}

3、编写统计候选人得票的程序,设有十个候选人,有100个人参加投票,每次 3、编写统计候选人得票的程序,设有十个候选人,有100个人参加投票,每次输入-一个得票的候选人的名字,要最后统计输出每个候选人的得票结果。 输入-一个得票的候选人的名字,要最后统计输出每个候选人的得票结果.

#include <stdio.h>
#include <string.h>
#define max 100
struct people {
	char name[10];//候选人姓名 
	int count;//得票数量 
}person[max];
//初始化候选人信息的函数 10个候选人 
void initVoteInfo(){
	for(int i=0;i<10;i++){
		printf("输入候选人姓名:");
		//赋值
		scanf("%s",&person[i].name); 
		person[i].count = 0; 
	}
} 
//插入投票信息的函数 n为投票人数 
void insertVoteInfo(int n){
	for(int i=0;i<n;i++){
		char namestr[10];//候选人姓名 
		printf("输入得票的候选人:");
		//赋值
		scanf("%s",namestr); 
		for(int j=0;j<10;j++){
			//判断字符串是否相等 
			if(strcmp(person[j].name, namestr) == 0){
				person[j].count = person[j].count + 1;
			}
		}
	}
}
//输出每个候选人投票结果 
void getVoteInfo(){
	for(int i=0;i<10;i++){
		printf("---候选人:%s得票数量为:%d\n",person[i].name,person[i].count);
	}
}  
int main(){
	//初始化
	printf("----------------开始录入基础信息----------------\n");
	initVoteInfo();
	printf("----------------基础信息录入完毕----------------\n");
	printf("------------------开始投票信息------------------\n");
	//投票
	int n; 
	printf("输入投票的总人数:");  
	scanf("%d",&n); 
	insertVoteInfo(n);
	printf("------------------结束投票信息------------------\n");
	//输出结果
	printf("------------------投票信息如下------------------\n");
	getVoteInfo();
	return 1;
}

 

15年真题编程题答案

1.编写一个函数,该函数有三个参数,一个是二维数组,一个是二维数组的行数,最后一个是二维数组的列数,输出该二维数组两条对角线元素之和。

#include <stdio.h>
//计算矩阵对角线元素之和 
int getSum(int arr[][3],int m,int n){
	if(m!=n){
		printf("数组函数列数不相等,不可以求对角线元素之和;\n");
		return 0; 
	}
	printf("矩阵元素为:\n"); 
	for(int i=0;i<m;i++){
		for(int j=0;j<n;j++){
			printf("%d ",arr[i][j]);
		}	
		printf("\n"); 	
	}
    int sum = 0;
    for(int i=0;i<m;i++){
    	sum = sum + arr[i][i];
	}
	for(int j=0;j<n;j++){
    	sum = sum + arr[n-j-1][j];
	}
    if(n%2 == 1){
    	//n为奇数 
    	sum = sum - arr[n/2][n/2];
	}
	printf("矩阵对角线元素之和为:%d",sum);
	return 1; 
}
 
int main()
{
    int a[3][4]={{2,5,8,7},{4,6,7,8},{3,1,5,2}};
    int b[4][4]={{2,5,8,7},{4,6,7,8},{3,1,5,2},{3,1,5,2}};
    int c[3][3]={{2,5,8},{4,6,7},{3,1,5}};
//    getSum(a,3,4);
//    getSum(b,4,4);
    getSum(c,3,3);
    return 1;
}

2编写一 个函数, 输入一个字符串,分别统计该字符 串中出现的数字字符个数,字母字符个数和其 他类型字符个数。

#include<stdio.h>
#include<string.h>
void fun(char *s)
{
    int i;
    //\0为结束字符 
    int num_count = 0;
    int char_count = 0;
    int else_count = 0;
    for(i=0;s[i]!='\0';i++){
        if(s[i]>='0'&& s[i]<='9'){
        	num_count++;
        }else if(s[i]>='a'&& s[i]<='z'){
        	char_count++;
        }else if(s[i]>='A'&& s[i]<='Z'){
        	char_count++;
        }else{
        	else_count++;
		}
    }
    printf("字符串中数字数量为:%d",num_count);
    printf("字符串中字母数量为:%d",char_count);
	printf("字符串中其它数量为:%d",else_count);
}
int main()
{
    char str[100];
    printf("请输入字符串:");
    gets(str);
    fun(str);
    return 0;
}

3、编写统计候选人得票的程序,设有十个候选人,有100个人参加投票,每次 3、编写统计候选人得票的程序,设有十个候选人,有100个人参加投票,每次输入-一个得票的候选人的名字,要最后统计输出每个候选人的得票结果。 输入-一个得票的候选人的名字,要最后统计输出每个候选人的得票结果.

#include <stdio.h>
#include <string.h>
#define max 100
struct people {
	char name[10];//候选人姓名 
	int count;//得票数量 
}person[max];
//初始化候选人信息的函数 10个候选人 
void initVoteInfo(){
	for(int i=0;i<10;i++){
		printf("输入候选人姓名:");
		//赋值
		scanf("%s",&person[i].name); 
		person[i].count = 0; 
	}
} 
//插入投票信息的函数 n为投票人数 
void insertVoteInfo(int n){
	for(int i=0;i<n;i++){
		char namestr[10];//候选人姓名 
		printf("输入得票的候选人:");
		//赋值
		scanf("%s",namestr); 
		for(int j=0;j<10;j++){
			//判断字符串是否相等 
			if(strcmp(person[j].name, namestr) == 0){
				person[j].count = person[j].count + 1;
			}
		}
	}
}
//输出每个候选人投票结果 
void getVoteInfo(){
	for(int i=0;i<10;i++){
		printf("---候选人:%s得票数量为:%d\n",person[i].name,person[i].count);
	}
}  
int main(){
	//初始化
	printf("----------------开始录入基础信息----------------\n");
	initVoteInfo();
	printf("----------------基础信息录入完毕----------------\n");
	printf("------------------开始投票信息------------------\n");
	//投票
	int n; 
	printf("输入投票的总人数:");  
	scanf("%d",&n); 
	insertVoteInfo(n);
	printf("------------------结束投票信息------------------\n");
	//输出结果
	printf("------------------投票信息如下------------------\n");
	getVoteInfo();
	return 1;
}

16年真题编程题答案

1、(10分)编写一个函数,功能是:将字符串s中的所有数字字符去掉,保留其余的字符,并且将形成的新字符串存储在原S的空间中。

#include<stdio.h>
#include<string.h>
void fun(char *s)
{
    int i,j=0;
    //\0为结束字符 
    for(i=0;s[i]!='\0';i++)
    {
        if(s[i]<'0'||s[i]>'9')
        {
        	//重新给S进行赋值 
            s[j++] = s[i];
        }
    }
    s[j]='\0';
    printf("删除后的为:%s",s);
}
int main()
{
    char str[100];
    printf("请输入字符串:");
    gets(str);
    fun(str);
    return 0;
}

2、(10分)编写一个函数,功能:从一个整数m中,统计其中各位上等于n的数字数目,并返回,其中0<=n<=9,若n越界,则返回-1,并提示‘第二个参 数越界',例如:4500201中有0共3个,编写主函数并调试。

#include <stdio.h>
#include <string.h>
int fun(char *s,int n)
{
	if(n<0 || n>9){
		printf("第二个参数越界");
		return -1;
	}
	char p;
	p = n +' 0';//数字转字符串 
	int sum = 0;
    //\0为结束字符 
    for(int i=0;s[i]!='\0';i++)
    {
        if(s[i] == p)
        {
        	sum++;
        }
    }
    printf("相同个数为:%d",sum);
    return 0;
}
int main()
{
	char str[100];
	int i,n;
	printf("请输入整数字符串:");
	gets(str);
	n=strlen(str);
	for(i=0;i<n;i++)
	{
		if(str[i]<'0'||str[i]>'9')
		{
			printf("\n输入有误,不是整数。\n");
			break;
		}
	}
	printf("请输入对比数字n:");
	scanf("%d",&n);//接收数据
	return fun(str,n); 	
}

3、(20分)建立一 个学生在某一一个课程到课情况统计程序。功能要求:

(1)可一次性输入所有学生的到课情况,输入学生总人数,该课程总课时,学生学号,及其到课情况,分为正常,迟到,请假,旷课;

(2)可统计某-个学生的到课情况的上课率(包括正常,迟到。旷课率,并输出。

(3)可统计所有学生的上课率,旷课率,并输出。

#include <stdio.h>
#include <string.h>
#define max 128
struct student {
	char studentcode[10];
	int normalcount;//正常次数 
	int latecount;//迟到次数 
	int leavecount;//请假次数 
	int absentcount;//旷课次数 
}person[max];
//插入学生信息的函数 
void insertStudentInfo(int n){
	for(int i=0;i<n;i++){
		printf("输入学生的学号 正常上课次数 迟到次数 请假次数 旷课次数:%s%d%d%d%d\n");
		//赋值
		scanf("%s%d%d%d%d",&person[i].studentcode,
		&person[i].normalcount,&person[i].latecount,
		&person[i].leavecount,&person[i].absentcount); 
	}
}
//根据学号获取某个学生的相关信息 
void getStudentInfo(int n,int sum,char *s){
	for(int i=0;i<n;i++){
		//判断字符是否相等 
		if(strcmp(person[i].studentcode, s) == 0){
			printf("学号为%s的学生上课情况如下:\n",person[i].studentcode);
			printf("    上课率为:%2f,旷课率:%2f\n",
			(float)(person[i].normalcount+person[i].latecount)/sum,
			(float)person[i].absentcount/sum);
		}	
	}
} 
//获取所有学生的相关信息 
void getAllStudentInfo(int n,int sum){
	int allincount = 0;
	int allabsentcount = 0;
	for(int i=0;i<n;i++){
		allincount = allincount + person[i].normalcount+person[i].latecount;
		allabsentcount = allabsentcount + person[i].absentcount;
	}
	printf("所有学生上课情况如下:\n");
	printf("    上课率为:%2f,旷课率:%2f\n",
	(float)allincount/(sum*n),
	(float)allabsentcount/(sum*n));
}
int main(){
	int n,sum;
	printf("----------------开始录入基础信息----------------\n");
	printf("输入学生的总人数:");  
	scanf("%d",&n);
	printf("输入总上课次数:");  
	scanf("%d",&sum);
	printf("----------------基础信息录入完毕----------------\n");
	printf("----------------开始录入学生信息----------------\n");
	insertStudentInfo(n);
	printf("----------------学生信息录入完毕----------------\n");
	char str[10];
	printf("请输入要查询的学生学号:");
	scanf("%s",&str);
	getStudentInfo(n,sum,str); 
	getAllStudentInfo(n,sum); 
	return 0;
}

17年编程题答案

应用题第八题

1、已知一个带有表头结点的单链表,结点结构为

假设该链表只给出了头指针list.在不改变链表的前提下,请设计一个尽可能高效算法、查找链表中倒数第k个位置上的结点(k为正整数)。若查找成功,算法输出该结点点的data域的值,并返回1;否则,只返回0。要求: 
1)描述算法的基本设计思想。 
2)描述算法的详细实现步骤。 
3)根据设计思想和实现步骤,采用程序设计语言描述算法(使用C、C++或Java语言实现),关键之处请给出简要注释。 

 

struct LinkNode{
	int data;
	LinkNode *link;
} *LinkList;
int Search_k(LinkList list,int k){
	//查找链表list倒数第k个结点,并输出该结点data域的值
	LinkList p=list->link;//指针p,q指向链表的第一个结点 
	LinkList q=list->link;
	int count=0;//计数器初始化为0 
	while(p!=NULL){//指针p依次遍历链表直至最后一个结点 
		if(count<k)
		count++;
		else
		q=q->link;
		p=p->link;
	} //while
	/*
	上面这几行是这个算法的核心思想,我来解释一下
	首先算法开始运行时,p在动,而q不动
	直到p向右移动了k次,此时k和count相等,这时候p和q一起向右移动
	如果k小于链表的长度,则返回q指针指向的数据域 
	*/
	if(count<k)//若k值大于链表的长度,则找不到该结点,返回0 
	return 0;
	else{
		//找到该结点则返回该结点的数据域 
		ptintf("该节点数据域为:%d"q->data,);
		return 1;
	} 
}

2、写一个折半查找函数;

#include <stdio.h>
//折半查找 
void halfSearch(int A[],int n){
	int low=0,high=9,mid;//high = A的长度 
	bool flag = false;
	//折半查找
	while(low<=high){
		mid = (low+high)/2;
		if(A[mid] == n){
			printf("---%d所在位置为:%d",n,(mid+1));
			flag = true;
		}
		if(A[mid]>n)
			high = mid - 1;
		else low = mid + 1;
	} 
	if(!flag){
		printf("---未找到所查元素");
	}
} 

int main(){
	int A[9] = {0,13,27,38,49,49,65,76,97}; 
	halfSearch(A,38);
	return 0;
}

3、设有两个栈S1、S2都采用顺序栈方式, 并且共享一个个存储区[0, ......,maxsize-1].为了尽量使用空间,减少溢出的可能,可采用栈顶相向,迎面增长的存储方式请设计S1、S2栈的出栈、进栈操作算法。要求:利用空间策略;算法数据结构;写出算法步骤;

#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#define STACKSIZE 100
typedef int ElemType;
typedef struct
{
	ElemType stack[STACKSIZE];
	int top[2];
}SSeqStack;
void InitStack(SSeqStack *S)//初始换栈
{
	S->top[0] = 0;
	S->top[1] = STACKSIZE-1;
}
 
int StackEmpty(SSeqStack S,int flag)//判断栈是否为空
{
	switch(flag)
	{
	case 0:
		if(S.top[0] == 0)
		{
			return 1;
		}
		break;
	case 1:
		if(S.top[1] == STACKSIZE-1)
		{
			return 1;
		}
		break;
	default:
		return 0;
	}
	return 0;
}
 
int GetTop(SSeqStack S,ElemType *e,int flag)//取栈顶元素
{
	switch(flag)
	{
	case 0:
		if(S.top[0] == 0)
		{
			return 0;
		}
		*e = S.stack[S.top[0]-1];
		break;
	case 1:
		if(S.top[1] == STACKSIZE-1)
		{
			return 0;
		}
		*e = S.stack[S.top[1]+1];
		break;
	default:
		return 0;
	}
	return 1;
}
 
int PushStack(SSeqStack *S,ElemType e,int flag)//入栈
{
	if(S->top[0] == S->top[1])
	{
		return 0;
	}
	switch(flag)
	{
	case 0:
		S->stack[S->top[0]] = e;
		S->top[0]++;
		break;
	case 1:
		S->stack[S->top[1]] = e;
		S->top[1]--;
		break;
	default:
		return 0;
	}
	return 1;
}
 
int PopStack(SSeqStack *S,ElemType *e,int flag)//出栈
{
	switch(flag)
	{
		if(S->top[0] == 0 )
		{
			return 0;
		}
	case 0:
		S->top[0]--;
		*e = S->stack[S->top[0]];
		break;
	case 1:
		if(S->top[1] == STACKSIZE-1)
		{
			return 0;
		}
		S->top[1]++;
		*e = S->stack[S->top[1]];
		break;
	default:
		return 0;
	}
	return 1;
}
 
int StackLength(SSeqStack S)//求栈长度
{
	return S.top[0]+S.top[1];
}
 
void ClearStack(SSeqStack *S)//清空栈
{
	S->top[0] = 0;
	S->top[1] = STACKSIZE-1;
}
//设有两个栈S1和S2都采用顺序栈的方式存储,并且共享一个存储区。
int main(void)
{
	SSeqStack S;
	int i;
	ElemType a[] = {'a','b','c','d','e'};
	ElemType b[] = {'x','y','z','r'};
	ElemType e1,e2;
	InitStack(&S);
	for(i = 0;i < sizeof(a)/sizeof(a[0]);i++)
	{
		if(PushStack(&S,a[i],0) == 0)
		{
			printf("栈已满,不能进栈!");
			return 0;
		}
	}
	for(i = 0;i < sizeof(b)/sizeof(b[0]);i++)
	{
		if(PushStack(&S,b[i],1) == 0)
		{
			printf("栈已满,不能进栈!");
			return 0;
		}
	}
	if(GetTop(S,&e1,0) == 0)
	{
		printf("栈已空!");
		return 0;
	}
	if(GetTop(S,&e2,1) == 0)
	{
		printf("栈已空!");
		return 0;
	}
	printf("左端栈栈顶元素是:%c,右端栈栈顶元素是:%c\n",e1,e2);
	printf("左端栈元素的出栈顺序是:");
	while(!StackEmpty(S,0))
	{
		PopStack(&S,&e1,0);
		printf("%4c",e1);
	}
	printf("\n");
	printf("右端栈元素的出栈顺序是:");
	while(!StackEmpty(S,1))
	{
		PopStack(&S,&e2,1);
		printf("%4c",e2);
	}
	printf("\n");
	return 0;
}

4、假设有n个作业,m台机器设备,每个作业i可选择一台设备加工, 加工时间为 Ti,每次一台设备只加工1个作业,基于贪心策略写程序,实现作业调度,使n个作业等待时间的和最小。

要求:写出贪心算法作业调度策略描述作业调度算法;写出算法数据结构:算法步骤;

参考博客:https://blog.csdn.net/iteye_6233/article/details/82338737

18年真题编程题答案

1、输入字符串,字符串以“#”结尾,判断每个字符串中0-9数字各有多少个?如输入: “9jss7h21H326tu2sw37*#*”输出0:0,1:1,2:3,4:0,5:0,6:1,7:2, 8:0,9:1”,输出格式不限制。

#include <stdio.h>
int main(){
	int x;
	int a[10] = {0}, i;
	printf("请输入数字字符串,以#结尾:");
	while((x=getchar()) != '#')
	if(x >= '0' && x <= '9') a[x-'0'] += 1;//x-'0'转变为数字 
	for(i=0;i<10;i++)
	printf("%d个数:%d ,",i,a[i]);
	printf("\n");
	return 0;
}


2.输入几个学生的姓名和成绩,要求分数相同时顺序相对输入时不变(即要求稳定排序),进行排序后输出。
如输入4个学生的成绩表如下: 
Jack 70
Petter 96
Joy 70
Lili 89
输出结果为:
Petter 96
Lili 89
Jack 70
Joy 70

#include <stdio.h>
#include <string.h>
#define max 128
struct student {
	char studentname[10];
	int score;//学生得分 
}person[max];
//插入学生信息的函数 
void insertStudentInfo(int n){
	for(int i=0;i<n;i++){
		printf("输入学生的姓名 分数: \n");
		//赋值
		scanf("%s%d",&person[i].studentname,
		&person[i].score); 
	}
}
//稳定排序  选择冒泡 
void scoreSort(int n){
	for(int i=0;i<n-1;i++){
		for(int j=n-1;j>i;j--){
			if(person[j-1].score<person[j].score){
				//交换 
				char studentname_temp[10];
				//C语言中字符串复制 strcpy(目标,源) 
				strcpy(studentname_temp,person[j].studentname);
				int score_temp = person[j].score;
				person[j].score = person[j-1].score;
				strcpy(person[j].studentname,person[j-1].studentname);
				person[j-1].score = score_temp;
				strcpy(person[j-1].studentname,studentname_temp);
			}
		} 
	}
	//输出
	printf("排序结果如下:\n");
	for(int i=0;i<n;i++){
		printf("%s %d\n",person[i].studentname,person[i].score);
	}
} 
int main(){
	int n,sum;
	printf("----------------开始录入基础信息----------------\n");
	printf("输入学生的总人数:");  
	scanf("%d",&n);
	printf("----------------基础信息录入完毕----------------\n");
	printf("----------------开始录入学生信息----------------\n");
	insertStudentInfo(n);
	printf("----------------学生信息录入完毕----------------\n");
	//排序 
	scoreSort(n); 
	return 0;
}


3、输入年月日,计算该天是本年的第N天(1<=年<=3000 1<=月<=12. 1<=日<=31)。如输入数据为y=2017, m=12, d=24,三个参数,输出结果为“N=358” 。

#include <stdio.h>
#include <stdlib.h>//system("pause")

int main()
{
	//total总天数,leap用于闰年的2月天数
	int year,month,day,total,leap;
	printf("请输入年月日(按顺序,中间用空格隔开):");
	scanf("%d%d%d",&year,&month,&day);
	if((year%4==0&&year%100!=0)||year%400==0)//判断是否闰年,闰年2月多一天,所以闰年leap为1,平年为leap为0。
	{
		leap=1;
	}else
	{ 
		leap=0;
	}
	//根据月份计算对应的最终天数。
	switch(month)
	{
		case 1:total=day;break;
		case 2:total=31*1+day;break;
		case 3:total=31*1+28+leap+day;break;
		case 4:total=31*2+28+leap+day;break;
		case 5:total=31*2+28+leap+30*1+day;break;
		case 6:total=31*3+28+leap+30*1+day;break;
		case 7:total=31*3+28+leap+30*2+day;break;
		case 8:total=31*4+28+leap+30*2+day;break;
		case 9:total=31*5+28+leap+30*2+day;break;
		case 10:total=31*5+28+leap+30*3+day;break;
		case 11:total=31*6+28+leap+30*3+day;break;
		case 12:total=31*6+28+leap+30*4+day;break;
		//12月之前的11个月中有6个31天,4个30天,2月为28天+leap。
	}
	if(year>=1&&year<=3000&&month>=1&&month<=12&&day>=1&&day<=31)//判断输入是否正解,年份最大为9999,可自行更改。
	{
		printf("%d月%d日止,%d年已过去%d天。\n",month,day,year,total);
		system("pause");//按任意键继续...
	}else{
		printf("错误\n");
		system("pause");//按任意键继续...
	}
    return 0;
}


4、M个相同的小球,放入N个相同的箱子,允许有的箱子空,求共有多少种分配的方法。循子不区分先后顺序,如有6个球,1.2.3和3.2.1是同一种放法)。

详情可查看https://blog.csdn.net/komonder/article/details/81879550

#include <stdio.h>
//具体做法就是穷举,也就是把所有情况穷举出来,就是用for循环
//所有情况下的一个是把指定 M个球放到N个箱里,
//也就是说N个箱每个箱都最少有一个球,这个功能由int fun(int m,int n);完成
//把 1个 ,2个, ·····n个的情况相加
int f(int m,int n)
{
    int sum = 0;
    int i=1;
    if(n>m) n=m;
    if((m==1)||(n==1)) return 1;
    for(i=1;i<=n;++i)
        sum+=fun(m,i);
    return sum;
}
//也就是说N个箱每个箱都最少有一个球
//也就是说把M个球必须放到N个箱里
//第一步就是把M个球拿出N个放到N个箱里,每一个箱子一个
//第二部是把剩下的M-N个 随机放到N个箱子里
int fun(int m,int n)
{
    if((n==1)||(n==m))return 1;
    
    return  f(m-n,n);
}
int main(){
    printf("分配方法数目  = %d",f(7,7));
    return 0;
}

19年真题编程题答案

应用题第二题使用队列模拟栈的进栈和出栈

参考https://www.cnblogs.com/TimLiuDream/p/10088115.html

应用题第五题第四问:

若已知两棵二叉树B1和B2皆为空,或者皆不空且B1的左、右子树和B2的左、右子树分别相似,则称二叉树B1和B2相似。试编写算法,判别给定两棵二叉树是否相似。

//二叉链表类型定义
typedef struct BiTNode {
    TElemType data;
    BiTNode  *lchild, *rchild;
} BiTNode, *BiTree;
//实现函数
Status Similar(BiTree t1, BiTree t2)
/* 判断两棵二叉树是否相似的递归算法 */
{
    if(!t1 && !t2)//同为空时,两树相似
        return TRUE;
    else if(t1 && t1){
        if(Similar(t1 -> lchild,t2 -> lchild) && Similar(t1 -> rchild,t2 -> rchild))
            //两树都不为空时,判断左右子树是否相似
            return TRUE;
        else
            return FALSE;
    }else//以上两种情况都不符合,就直接返回FALSE
        return FALSE;
}

1、输入若干个点的坐标(x,y),xy都是正整数,当输入(0, 0)时表示输入结束、现要求输入完毕以后,输出一个长方形左下角和右上角的坐标。要求长方形区域覆盖所有输入点坐标。(若只输入了一个点的坐标则可以只输出1个点)

要求:写出基本设计思想;具体实现步骤;写出程序的代码

#include <stdio.h>
#define max 128
struct point {
	int x_point;//x坐标值 
	int y_point;//y坐标值 
}location[max];
/**
问题分析:
	长方形左下角坐标为x最小值 y最小值 
	右上角坐标为x最大值 y最大值 
*/ 
//插入坐标 
void insertPoint(int i,int x_point,int y_point){
	location[i].x_point = x_point;
	location[i].y_point = y_point;
}
//横坐标从小到大排  纵坐标从小到大排 
void sort_fun(int n){
	for(int i=0;i<n-1;i++){
		for(int j=n-1;j>i;j--){
			if(location[j-1].x_point>location[j].x_point){
				//交换 x 
				int x_point_temp = location[j].x_point;
				location[j].x_point = location[j-1].x_point;
				location[j-1].x_point = x_point_temp;
			}
			if(location[j-1].y_point>location[j].y_point){
				//交换 y 
				int y_point_temp = location[j].y_point;
				location[j].y_point = location[j-1].y_point;
				location[j-1].y_point = y_point_temp;
			}
		} 
	}
} 
int main(){
	int i = 0;
	printf("---------------开始输入坐标信息--------------\n");
	bool flag = true;//结束标识
	while(flag){
		int x_point,y_point;
		printf("输入坐标,以空格隔开,输入0 0 表示结束:");
		scanf("%d%d",&x_point,&y_point); 
		if(x_point !=0 && y_point !=0){
			insertPoint(i,x_point,y_point);
			i=i+1;
		}else{
			flag = false;
		} 
	} 
	printf("---------------结束输入坐标信息--------------\n");
	sort_fun(i);
	printf("长方形左下角坐标为:(%d,%d)",location[0].x_point,location[0].y_point);
	printf("长方形右上角坐标为:(%d,%d)",location[i-1].x_point,location[i-1].y_point);
	return 0;
}

 

2、回文串可以被定义为形如abccba,也可以是a bc c b a(含空格)

(1)使用递归思想,实现一个可以检测回文串的函数。
(2)不使用递归,使用栈来实现检测回文子串的功能。
要求:写出算法基本设过思想,具体实现步骤和代码。

#include <stdio.h>
#include <string.h>
//非递归算法 
void noRecursion(char *str){
	int len,i;
	len=strlen(str);
	for(i=0;i<len/2;i++){
		if(str[i]!=str[len-1-i]) 
			break;
	}
	printf("非递归算法检测如下:");
	if(i==(len/2)){
		printf("%s是回文串\n",str);
	}else{
		printf("%s不是回文串\n",str);
	}
}
//递归算法 
bool ispal(char *s,int x,int y){
    if(y-x<=1) return true;
    return s[x]==s[y-1] && ispal(s,x+1,y-1);
}
int main()
{
	char str[100];
	printf("字符串:");
	gets(str);
	//非递归算法 
	noRecursion(str);
	int length = strlen(str);
	//递归算法
	bool flag = ispal(str,0,length);
	printf("递归算法检测如下:");
	if(flag){
		printf("%s是回文串\n",str);
	}else{
		printf("%s不是回文串\n",str);
	}
	return 0; 	
}

 


3、从一个无序列找出共中的逆序对。要求时间复杂度为O(nlogn)。如果不能实现上述时间复杂度,请分析出自己所写程序的时间复杂度。
样例:对于一个包含N个非负整数的数组A[1...n].如果有i<j且>A[j].则称(A[i],A[j])为1个逆序对。例如输入数组[3,1,4,5,2]则输出逆序对为(3,1), (3,2),(4,2),(5,2)共4个。
要求:利用空间策略;算法数据结构;写出算法步骤和代码。

#include <stdio.h>
/**
	归并排序求逆对数 时间复杂度为O(nlogn)
	temp为辅助数组 
*/ 
void merge(int arr[],int start,int mid,int end,int temp[],long long *count){
    int index = 0,index1 = 0,index2 = 0;
    index = 0; index1 = start; index2 = mid+1;

    while((index1<=mid) && (index2<=end)){
        if(arr[index1] <= arr[index2]){
            temp[index++] = arr[index1++];
        }else{
            temp[index++] = arr[index2++];
            //ans+=e1-p1+1;
            (*count) = (*count) + mid - index1 + 1;
            for(int m =start;m<index2-1;m++){
            	if(arr[index2-1]<arr[m]){
            		printf("(%d,%d) ",arr[m],arr[index2-1]);
				}	
			} 
        }
    }
    //第一个表未检测完  复制 
    while(index1<=mid)
        temp[index++] = arr[index1++];
    //第二个表未检测完  复制 
    while(index2<=end)
        temp[index++] = arr[index2++];

    for(int i=0;i<index;i++){
        // 复制也是递归进行的,所以并不是从start开始到end
        arr[start+i] = temp[i];
    }
}

void mergeSort(int arr[],int start,int end,int temp[],long long *count){
    if(start<end){ // 递归出口
        int mid = 0;
        mid = (start+end)/2;//从中间划分两个子序列 
        mergeSort(arr,start,mid,temp,count);//左侧递归归并 
        mergeSort(arr,mid+1,end,temp,count);//右侧递归归并 
        merge(arr,start,mid,end,temp,count);//归并 
    }
}
int main() 
{ 
    long long count = 0;
        int m = 5;
        int *a = new int[m];
        printf("输入五个数以空格隔开:");
        for(int i=0;i<m;i++){
            scanf("%d",&a[i]); 
        }
 		printf("逆对数如下:\n");
        int *temp = new int[m];
        mergeSort(a,0,m-1,temp,&count);
        delete []a;
        delete []temp;
    	printf("逆对数有%d对",count); 
        return 0;
}

20年编程题答案

1.a、b、c、d四个0-9的数字,输出所有使得abcd+cadb=9102的abcd数字(15分)。

#include <stdio.h>
/**
a、b、c、d四个0-9的数字,输出所有使得abcd+cadb=9102的abcd数字
*/
void findFunction(){
	int num_1,num_2;
	int i=0;
	int a,b,c,d;
	printf("所有使得abcd+cadb=9102的abcd数字如下:\n");
	for(a=0;a<9;a++){
		for(b=0;b<9;b++){
			for(c=0;c<9;c++){
				for(d=0;d<9;d++){
					num_1 = a*1000+b*100+c*10+d;
					num_2 = c*1000+a*100+d*10+b;
					if((num_1+num_2) == 9102){
						printf("-----------第%d组------\n",(i+1));
						printf("---%d:",a);
						printf("---%d:",b);
						printf("---%d:",c);
						printf("---%d:",d);
						i++;
					}
				}
			}
		}		
	}
	printf("------程序运行结束,共有%d个.\n",i);
}
int main(){
	findFunction();
	return 1;
} 

2、反序数指整数各位取反之后的数。如321 的反序是123,147 的反序是741,现输入n组a,b(ab均大于0且小于10000),如果a、b反转的和等于和的反转,则输出a、b.
例如: a=123, b=456, 那么a+b的和= 123+456=579.

#include <stdio.h>
//取反函数 
int reverse(int x)
{
    int s = 0;
    if(x<0)
    {
        printf("数字不可以为负数;\n");
		return 0; 
    }
    while(x>0)
    {
       s = s*10+x%10;
       x = x/10; 
    }
   return s ;
}
 
int main()
{
    int a,b;
    printf("输入a和b,以空格隔开:");
    scanf("%d%d",&a,&b);
	int a_reverse = reverse(a);
	int b_reverse = reverse(b);
	int sum = a+b;
	int sum_reverse = reverse(sum);
	if(sum_reverse == (a_reverse+b_reverse)){
		printf("%d,%d可以使反的和等于和的反",a,b);
	}
    return 0;
}

3、公司发礼品,有n件商品价值为al, a... .an的不同商品(0<an<=40)、 其价值各不相同。某员工有总价值200元的商品可以选,问总共有多少种搭配?

 

  • 29
    点赞
  • 107
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值