目录
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)建立一个学生在某一个课程到课情况统计程序。功能要求:
- 可一次性输入所有学生的到课情况,输入学生总人数,该课程总课时,学生学号,及其到课情况,分为正常,迟到,请假,旷课;
- 可统计某一学生的到课情况的上课率(包括正常,迟到),旷课率并输出。
- 可统计所有学生的上课率,旷课率并输出。
写出所有的数据结构;写出算法描述;写出源代码。
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的正整数的所有因子之和等于这个数本身,则这个数就是完美数。同时完美数还满足
的形式,其中p为素数,例如
输入:给定一个正整数
输出:输出两行,如果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