西交915编程题总结

目录

2013年西交915编程题

2014年西交915编程题

2015年西交915编程题

2016年西交915编程题

2017年西交915编程题

2018年西交915编程题

2019年西交915编程题

2020年西交915编程题

2021年西交915编程题


2013年西交915编程题

        编写c语言程序,该程序的功能是确定字符串中首次出现的某字符在串中的位置(即该字符是字符串中的第几个字符),然后从字符串中删除该字符。要求:
1.如果未找到该字符,程序给出相应信息,否则,输出该字符在字符串中首次出现的位置,删除该字符,并且显示删除前后的字符串。
2.通过键盘输入字符串以及被确定的字符。

2014年西交915编程题

(1)编写一个程序,输入一个十进制的数,输出相应的二进制数,八进制数和十六进制数。

#include<stdio.h>

int binary(int num);
int main(){
	int num;
	scanf("%d",&num);
	printf("二进制为:"); 
	binary(num);
	printf("\n八进制为:%o\n",num);
	printf("十六进制为:%x\n",num);
} 
int binary(int num){
	if(num>0){
		binary(num/2);
		printf("%d",num%2);
	}
}


(2)编写一个程序,输入一串字符,以回车结束,判断该字符串是否是回文串,如“abcddcba”是回文串,即正读反读相同的串。
(3)输入a,b两个字符串,将两个字符串a,b连接起来。

2015年西交915编程题

(1)编写一个函数,该函数有三个参数,一个是二维数组,一个是二维数组的行,一个是二维数组的列数,输出该二维数组两条对角线元素之和。
(2)编写一个函数,输入一个字符串,分别统计该字符串中出现的数字字符个数,字母字符个数和其他类型字符的个数。
(3)编写一个候选人的得票统计程序,设有m个选举人,n个候选人每输入一个得票的候选人名字,要求输出每一个候选人的得票情况。
(4)编写一个函数,统计出单链表中值等于x的个数。


2016年西交915编程题

(1)编写一个函数,功能是:将字符串s中的所有数字字符去掉,保留其余的字符,并且将形成的新字符串存储在原来s的空间中。
(2)编写一个函数,功能:从一个整数m中,统计其中各位上等于n的数字数目,并返回,其中n在0到9之间,若n越界,则返回-1,并提示“第二个参数越界”。例如4500201中有0共3个,编写主函数并调试。
(3)建立一个学生在某一个课程到课情况统计程序。功能要求:

  1. 可一次性输入所有学生的到课情况,输入学生总人数,该课程总课时,学生学号,及其到课情况,分为正常,迟到,请假,旷课;
  2. 可统计某一学生的到课情况的上课率(包括正常,迟到),旷课率并输出。
  3. 可统计所有学生的上课率,旷课率并输出。

写出所有的数据结构;写出算法描述;写出源代码。

2017年西交915编程题

(1)带头结点的单链表,只有头指针list,不改变链表的情况下,设计一个高效算法,查找倒数第k位上的结点,查找成功输出对应的data值,成功返回1,否则返回0.
(2)写一个折半查找函数,尽可能使得时间复杂度最小。
(3)设有两个栈s1,s2都采用顺序栈,并且共享一个存储区[0…maxsize-1].为了尽量使用空间,减少溢出的可能,可采用栈顶相向,迎面增长的存储方式,请设计s1,s2栈的出栈、进栈操作算法。
(4)假设有n个作业,m台机器设备,每个作业i可选择一台设备加工,加工时间为Ti,每次一台设备只可以加工一个作业,基于贪心策略,实现作业调度,使n个作业等待时间的和最小。

2018年西交915编程题

(1)输入一串字符串,字符串以“#”结尾,判断输入的字符串中0至9的个数。

(2)输入学生的姓名和成绩,按照学生成绩进行排序后输出。

(3)输入年月日,求这是当年第几天。

#include<stdio.h> 

int main(){
	int year, month, day;
	int sum=0;
	scanf("%d %d %d",&year,&month,&day);
	switch(month){
		case 12: sum+=30;
		case 11: sum+=31;
		case 10: sum+=30;
		case 9: sum+=31;
		case 8: sum+=30;
		case 7: sum+=31;
		case 6: sum+=30;
		case 5: sum+=31;
		case 4: sum+=30;
		case 3:
			if((year%4==0 && year%100!=0 )|| year%400==0){
				sum+=29;
			}else{
				sum+=28;
			}
		case 2: sum+=31;
		case 1: sum+=day;
	}
	printf("%d年%d月%d日是今年的第%d天\n",year,month,day,sum);
}

(4)将m个相同的球全部放到n个相同的盒子里有多少种放法。

#include<stdio.h>

int fun(int m, int n);

int main(){
	int m,n;
	scanf("%d%d",&m,&n);
	printf("一共有%d种组合方法\n",fun(m,n));
} 

int fun(int m, int n){
	int sum=0,count;		//sum统计组合数,count为递归数 
	if(m<n){				//当球数少于盒子数,返回0 
		return 0;
	}
	if(n==1 || (m-n)<=1){	//当只有一个盒子或球数等于盒子数或者球数等于盒子数+1时,只有一种分配方式 
		return 1;
	}
	if(m-n < n){			//统计递归数,当剩余球数少于盒子数,那递归等于剩余球数 
		count = m-n;
	} else{
		count = n;			//否则递归数等于盒子数 
	}
	for(int i=1; i<=count;i++){		//进行递归,一次进行当盒子和1.2.3···count进行统计 
		sum+=fun(m-n, i);
	}	
	return sum;
}


2019年西交915编程题

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

#include<stdio.h>

int main(){
	int x,y;
	int left, bottom, right, top;
	int num=0;
	scanf("%d %d",&x,&y);
	left = x; right = x; bottom = y; top = y;
	while(x!=0 || y!=0){
		if(x<left){
			left = x;
		}
		if(x>right){
			right = x;
		}
		if(y>top){
			top = y;
		}
		if(y<bottom){
			bottom = y;
		}
		scanf("%d %d",&x,&y);
		num++;
		
	}
	if(num == 1){
		printf("(%d,%d)\n",left,bottom);
	}else{
		printf("左下角坐标为:(%d,%d)\n",left,bottom);
		printf("右上角坐标为:(%d,%d)\n",right,top); 
	}
	return 0;
} 

(2)回文串可以被定义为形如abccba,也可以是a bc c b a(含空格)。
        (1)使用递归思想,实现一个检测回文串的函数。
        (2)不使用递归,使用栈来实现上述功能。

#include<stdio.h>
#include<string.h>

#define N 100

int delBlank(char str[]);
int isHuiWen1(char *str, int len);		//非递归判断是否为回文序列 
int isHuiWen2(char *str, int len);		//递归判断是否为回文序列 

int main(){
	char str[N];
	int len,result;
	printf("请输入一个字符串:\n");
	gets(str);
	len = delBlank(str);				//删除字符串中的空格 
	
	result = isHuiWen2(str, len);		//调用函数判断是否为回文序列,若是,则返回1;若不是,则返回0; 
	if(result == 1){
		printf("是回文序列");
	}else if(result == 0){
		printf("不是回文序列");
	} 
	return 0;
} 
int delBlank(char *str){				//删除空格,返回删除空格后的字符串长度 
	int len = strlen(str);
	int blankNum = 0;
	int i=0,j;
	while(i<len-blankNum){
		if(str[i]==' '){
			for(j=i+1; j<len-blankNum; j++){
				str[j-1] = str[j];
			}
			blankNum++;
		}else{
			i++;
		}
	}
	return len-blankNum;
}

int isHuiWen1(char *str, int len){	
	
	int i=0,j=len-1;
	while(i<j){							//采用循环判断是否为回文序列 
		if(str[i] != str[j]){
			return 0;
		} else{
			i++;
			j--;
		}
	}
	return 1;
}

int isHuiWen2(char *str, int len){		//采用递归判断是否为回文序列 
	if(len ==0 || len == 1){
		return 1;
	}else{
		if(str[0] == str[len-1]){
			return isHuiWen2(str+1, len-2);
		}else{
			return 0;
		}
	}
}

(3)一个无序序列,找出其中的逆序对。要求时间复杂度为O(nlogn)。如果不能实现上述时间复杂度,请分析你自己所实现程序的时间复杂度。关于一个包含N个非负整数的数组A[1…n],如果i<j,并且A[I]>A[J],则称(A[i],A[j])为数组A中的一个逆序对。

#include<stdio.h> 

int merge (int A[], int begin, int mid, int end);
int mergeSort(int a[], int begin, int end);

int main() {
	int n;
	int i;
	scanf("%d",&n);
	int a[n];
	for(i=0; i<n; i++){
		scanf("%d",&a[i]);
	}
	int begin = 0, end = n - 1;
	printf("共有%d逆序数\n",mergeSort(a, begin, end));
	return 0;
}

/* 
 * 归并排序中调用merge函数 
 */  
int mergeSort(int a[], int begin, int end) {  
	int sum=0; 
    if (begin<end) {  
        int mid = (begin+end)/2;  
        mergeSort (a,begin,mid);  
        mergeSort (a,mid+1,end);  
        sum = merge(a,begin,mid,end);  
    }  
    return sum;
}

int merge (int A[], int begin, int mid, int end) {  
		static int count = 0;
        int result[end - begin + 1];  
        int i = begin;  
        int j = mid + 1;  
        int k = 0;  
        while (i <= mid && j <= end) {  
            if (A[i] <= A[j]) {  
                result[k++] = A[i++];  
            }  
            else {  
                count+=mid-i+1;  
                result[k++] = A[j++];  
            }  
        }  
        while (j<=end)  
            result[k++] = A[j++];  
        while (i<=mid)  
            result[k++] = A[i++];    
        for(k=0; k<end-begin+1;k++)  
            A[begin+k] = result[k];  
        return count;
    }  

2020年西交915编程题

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

#include<stdio.h>

int main(){
	int a,b,c,d;
	int abcd=9102; 
	while(abcd>0){
		a = abcd/1000;
		b = abcd/100%10;
		c = abcd/10%10;
		d = abcd%10;
		if((abcd+c*1000+a*100+d*10+b)==9102){
			printf("%d\n",abcd);
		}
		abcd--;
	}
} 

(2)反序数指整数各位取反之后的数。如321的反序是123,147的反序是741.现输入n组a,b(a,b均大于0并小于10000),如果a,b反转的和等于和的反正,则输出a,b。例如a=123,b=456,那么a+b和为123+456=579,a与b的反转数和为321+654=975,579的反转数是975,满足题意故输出。

#include<stdio.h>
 
int reverse1(int num);
int reverse2(int num);

int main(){
	int i; 
	int n;
	int sum1,sum2;
	int r0,r1;
	scanf("%d",&n);
	int num[n][2];
	for(i=0;i<n;i++){
		printf("请输入两个数:"); 
		scanf("%d %d",&num[i][0],&num[i][1]);
		sum1 = num[i][0]+num[i][1];
		r0 = reverse2(num[i][0]);
		r1 = reverse2(num[i][1]);
		sum2 = r0+r1;
		if(reverse2(sum1) == sum2){
			printf("%d与%d可以组成反序数!\n",num[i][0],num[i][1]);
		}else{
			printf("%d与%d不可以组成反序数!\n",num[i][0],num[i][1]);
		}	
	}
	return 0;
}
//方法1: 
int reverse1(int num){
	int a,b,c,d;
	if(num>=1000 && num<10000){
		a = num/1000;
		b = num/100%10;
		c = num/10%10;
		d = num%10;
		return d*1000+c*100+b*10+a;
	}else if(num>=100 && num<1000){
		b = num/100;
		c = num/10%10;
		d = num%10;
		return d*100+c*10+b;
	}else if(num>=10 && num<100){
		c = num/10;
		d = num%10;
		return d*10+c;
	}else if(num>0 && num<10){
		return num;
	} 
}
//方法2
 int reverse2(int num){
	int result = 0;
	while(num != 0){
		result = result*10 + (num%10);
		num/=10;
	}
	return result;
}

(3)输入第一行为n代表输入的组数,下面几行代表几对数组。要求可以输入多组数据。符合条件则输出对应组数,否则输出none。


(4)公司发礼品,有n件商品价值为a1,a2…an的不同商品,其价值各不相同。某员工有总价值200元的商品可以选,问总共有多少种商品搭配。

2021年西交915编程题

(1)请写应该程序,找出给定矩阵的马鞍点。若一个矩阵中的某元素在其所在行最小而在其所在列最大,则元素为矩阵的一个马鞍点。输入数据由m+1行构成,第一行只有两个整数m和n,分别表示矩阵的行数和列数,接下来m行,每行n个表示矩阵元素。输出马鞍点数,每行一个,为行列以及马鞍数。如果不存在,则输出“not exist”。

#include<stdio.h>

int fun(int matrix[100][100],int m, int n, int result[100][3], int len);

int main(){
	
	int i,j;				//循环变量 
	int matrix[100][100];	//存储矩阵 
	int result[100][3];		//存储结果中的行坐标、列坐标和马鞍数 
	int len=0;				//马鞍数的个数 
	int m,n;				//要求输入的矩阵行数和列数
	
	scanf("%d %d",&m,&n);
	for(i=0; i<m; i++){		//循环输入矩阵 
		for(j=0; j<n; j++){
			scanf("%d",&matrix[i][j]);
		}
	} 
	
	len = fun(matrix,m,n,result,len); 
	
	if(len == 0){			//输出 
		printf("not exist");
	}else{
		for(i=0; i<len; i++){		
			printf("%d %d %d\n",result[i][0],result[i][1],result[i][2]);
		}		
	}
	return 0;
}

int fun(int matrix[100][100],int m, int n, int result[100][3], int len){
	
	int i,j,k;								//循环变量 
	int s,t;								//s存储行最小的值在第几列,t存储列最大的值在第几行 
	int min,max;							//存储行最小的值和列最大的值 
	for(i=0; i<m; i++){
		min = matrix[i][0];
		for(j=1; j<n; j++){					//寻找行最小 
			if(matrix[i][j] < min){
				min = matrix[i][j];
				s = j;
			}		
		}
		max = matrix[0][s];
		for(k=1; k<m; k++){					//寻找列最大 
			if(matrix[k][s] > max){
				max = matrix[k][s];
				t = k;
			}		
		}
		if(min == max){						//比较该数是不是马鞍数 
			result[len][0] = t;
			result[len][1] = s;
			result[len][2] = min;
			len++;
		}

	}
	return len;	
}

(2)完美数定义--------如果一个大于1的正整数的所有因子之和等于这个数本身,则这个数就是完美数。同时完美数还满足2^{p-1}*(2^{p}-1)的形式,其中p为素数,例如6=2^{1}*(2^{2}-1)
输入:给定一个正整数
输出:输出两行,如果n是完美数,返回true,否则返回false。并在第二行按照从小到大输出10000内的完美数以及对应的p值。

#include<stdio.h>
#include<math.h>

int isPerfectNum(int n);
void funP(int num[100][2], int len);

int main(){
	
	int in;
	int i;
	int num[100][2];						//存储完美数和P值 
	int len=0;								//统计完美数的个数 
	scanf("%d",&in);						//输入要判断是否为完美数的数字 
	if(isPerfectNum(in) == 1){				//如果是完美数,则输出true 
		printf("true\n");
	}else if(isPerfectNum(in) == 0){		//如果不是完美数,则输出false 
		printf("false\n");
	}
	for(i=2; i<10000; i++){					//输出10000以内的完美数 
		if(isPerfectNum(i) == 1){
			num[len++][0] = i; 
//			printf("%d ",i);
		}
	}
	funP(num,len);							//多此一步进行计算P,在输出完美数和对应的P值 
	for(i=0; i<len; i++){
		printf("%d\t%d\n",num[i][0],num[i][1]);
	}
	
	return 0;
}

int isPerfectNum(int n){
	int num[100];					//定义数组存放因子 
	int len = 0;					//统计有多少因子,为之后的相加做准备 
	int sum = 0;					//定义变量,为之后的相加做准备 
	int i;
	for(i=1; i<n;i++){			//讲所有因子存入数组,为之后的相加判断做准备 
		if(n%i == 0){
			num[len++] = i;
		}
	}
	for(i=0; i<len; i++){			//讲所有的因子相加 
		sum += num[i];
	}
	if(sum == n){					//判断是否为完美数
		return 1;					 
	}else{
		return 0;
	}
}

void funP(int num[100][2], int len) {		//求p 
	int i,p,temp;
	for(i=0; i<len; i++){
		for(p=1; p<num[i][0]; p++){
			temp = pow(2,p-1)*(pow(2,p)-1);
			if(temp == num[i][0]){
				num[i][1] = p;
				break;
			}
		}
	}
}

(3)虚拟机器人复制,第一天生产一个成熟机器人。成熟机器人每天可生产一个新机器人,新机器人3天可变成成熟机器人。
输入:第n天
输出:第n天的机器人总数。

#include<stdio.h>

int Fib(int n);

int main(){
	
	int in;
	int result; 
	scanf("%d",&in);
	result = Fib(n);
	printf("第%d天的机器总数为:%d \n",in,result);
	return 0;
} 

int Fib(int n){
	if(n == 1){
		return 1;
	}else if(n == 2){
		return 2;
	}else if(n == 3){
		return 3;
	}else{
		return Fib(n-1) + Fib(n-3);
	}
}

2022年西交915编程题

(1)忘了(很简单)
(2)判断5张扑克牌是不是顺子,其中,大小王可以充当任何数。

#include<stdio.h>
#include<string.h>
#define N 100
 //0充当大小王,11充当J,12充当Q,13充当K 
int main(){
	
	int a[5];					//数组存放输入的5个数 
	int i,j,k;					//循环变量 
	int num0=0;					//num0存放0的个数 
	for(int i=0;i<5;i++){
		scanf("%d",&a[i]); 
	}
	
	for(i=0;i<5;i++){			//统计大小王0的个数 
		if(a[i]==0){
			num0++;
		}
	}
	
	for(i=0;i<4;i++){			//冒泡排序 
		for(int j=0;j<4-i;j++){
			int temp;
			if(a[j]>a[j+1]){
				temp=a[j];
				a[j]=a[j+1];
				a[j+1]=temp;
			}
		}
	}

	switch(num0){
		case 0:{
			int count=0;
			for(int i=0;i<4;i++){		
				if(a[i]+1==a[i+1]){
					continue;
				}else{
					printf("不能构成顺子");
					return 0;
				}
			}
			printf("可以构成顺子");
			break;
		}
		case 1:{
			int count1=0;
			for(int i=1;i<4;i++){		
				if(a[i]+1==a[i+1]){
					continue;
				}else if(a[i]+2 == a[i+1] && count1<1){
					count1++;		
				}else{
					printf("不能构成顺子");
					return 0;
				}
			}	
			printf("可以构成顺子");
			break;
		}	
		case 2:{
			int count2=0;
			for(int i=2;i<4;i++){	
				if(a[i]+1==a[i+1]){
					continue;
				}else if(a[i]+2==a[i+1] && count2<2){
					count2++;		
				}else if(a[i]+3==a[i+1] && count2==0){
					count2+=2;
				}else{
					printf("不能构成顺子");
					return 0;
				}
			}		
			printf("可以构成顺子");
		}
	}
}

方法二:

#include<stdio.h>
 //0充当大小王,11充当J,12充当Q,13充当K 
int main(){
	
	int a[5];					//数组存放输入的5个数 
	int i=1;					//循环变量 
	int num[20] = {0};				//牌数量	
	int len=1;	
	for(int i=0;i<5;i++){		//输入+处理 
		scanf("%d",&a[i]); 
		num[a[i]]++;			//统计每张牌数量 
	}
	while(num[i]==0){			//寻找第一张牌 
		i++;
	} 
	while(len<5) {
		 if(num[i+1]==1){		//下一张牌存在 
		 	len++;
		 	i++;
		 	continue;
		 }else if(num[i+1]==0){		//下一张牌不存在 
		 	if(num[0] > 0){		//存在大小王代替 
		 		num[0]--;
		 		i++;
		 		len++;
		 		continue;
			 }else{				//不存在大小王则结束 
			 	break;
			 }
		 }else{					//存在多个同一张牌则结束 
		 	break;
		 }
	}
	if(len == 5){
		printf("可以构成顺子"); 
	}else{
		printf("不能构成顺子"); 
	}
}

(3)一堆数中,求不同组合数加起来等于某一个target的数的组合,并要求输出所有的组合。

#include<stdio.h>
#include<string.h>

int N; 
int a[100];
int target;
bool visited[100];
int sum;
void backtrace(int n);
 
int main(){ 
	memset(visited,0,sizeof(visited));
	printf("请输入组合数长度:");
	scanf("%d",&N);
	printf("请输入一组组合数:");
	for(int i=0;i<N;i++){
		scanf("%d",&a[i]);
	}
	printf("请输入目标数:");
	scanf("%d",&target);
	
	for(int i=0;i<N-1;i++){			//冒泡排序一堆数 
		for(int j=0;j<N-1-i;j++){
			if(a[j]<a[j+1]){
				int temp=a[j];
				a[j]=a[j+1];
				a[j+1]=temp;	
			}	
		}
	}

	backtrace(0);	
}
void backtrace(int n){
	if(sum>target)
		return;
	if(sum==target){
		for(int i=0;i<n;i++){
			if(visited[i])
				printf("%d ",a[i]);
		}
		printf("\n");
		return;
	}
	for(int i=n;i<N;i++){
		visited[i]=true;
		sum+=a[i];
		backtrace(i+1);
	
		visited[i]=false;
		sum-=a[i];
		while(i<N&&a[i]==a[i+1])
			i++;
	}	
}

样例输入:

请输入组合数长度:5

请输入一组组合数:1,2,3,4,5

请输入目标数:9

样例输出:

5,4

5,3,1

4,3,2

  • 2
    点赞
  • 46
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

空梦♡

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值