当前位置:   article > 正文

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

西安交通大学大学计算机编程题答案

06年真题编程题答案

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

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

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

  1. #include <stdio.h>
  2. int fun(int n)
  3. {
  4. if(n==0)return 0;
  5. if(n==1)return 1;
  6. if(n==2)return 2;
  7. if(n>=3)return fun(n-1)*n;
  8. }
  9. int main()
  10. {
  11. int n,result;
  12. printf("输入整数n:");
  13. scanf("%d",&n);
  14. result=fun(n);
  15. printf("%d!计算结果为:%d",n,result);
  16. return 0;
  17. }

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

  1. #include <stdio.h>
  2. #include <string.h>
  3. #define max 100
  4. struct people {
  5. char name[10];//候选人姓名
  6. int count;//得票数量
  7. }person[max];
  8. //初始化候选人信息的函数 10个候选人
  9. void initVoteInfo(){
  10. for(int i=0;i<10;i++){
  11. printf("输入候选人姓名:");
  12. //赋值
  13. scanf("%s",&person[i].name);
  14. person[i].count = 0;
  15. }
  16. }
  17. //插入投票信息的函数 n为投票人数
  18. void insertVoteInfo(int n){
  19. for(int i=0;i<n;i++){
  20. char namestr[10];//候选人姓名
  21. printf("输入得票的候选人:");
  22. //赋值
  23. scanf("%s",namestr);
  24. for(int j=0;j<10;j++){
  25. //判断字符串是否相等
  26. if(strcmp(person[j].name, namestr) == 0){
  27. person[j].count = person[j].count + 1;
  28. }
  29. }
  30. }
  31. }
  32. //输出每个候选人投票结果
  33. void getVoteInfo(){
  34. for(int i=0;i<10;i++){
  35. printf("---候选人:%s得票数量为:%d\n",person[i].name,person[i].count);
  36. }
  37. }
  38. int main(){
  39. //初始化
  40. printf("----------------开始录入基础信息----------------\n");
  41. initVoteInfo();
  42. printf("----------------基础信息录入完毕----------------\n");
  43. printf("------------------开始投票信息------------------\n");
  44. //投票
  45. int n;
  46. printf("输入投票的总人数:");
  47. scanf("%d",&n);
  48. insertVoteInfo(n);
  49. printf("------------------结束投票信息------------------\n");
  50. //输出结果
  51. printf("------------------投票信息如下------------------\n");
  52. getVoteInfo();
  53. return 1;
  54. }

 

15年真题编程题答案

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

  1. #include <stdio.h>
  2. //计算矩阵对角线元素之和
  3. int getSum(int arr[][3],int m,int n){
  4. if(m!=n){
  5. printf("数组函数列数不相等,不可以求对角线元素之和;\n");
  6. return 0;
  7. }
  8. printf("矩阵元素为:\n");
  9. for(int i=0;i<m;i++){
  10. for(int j=0;j<n;j++){
  11. printf("%d ",arr[i][j]);
  12. }
  13. printf("\n");
  14. }
  15. int sum = 0;
  16. for(int i=0;i<m;i++){
  17. sum = sum + arr[i][i];
  18. }
  19. for(int j=0;j<n;j++){
  20. sum = sum + arr[n-j-1][j];
  21. }
  22. if(n%2 == 1){
  23. //n为奇数
  24. sum = sum - arr[n/2][n/2];
  25. }
  26. printf("矩阵对角线元素之和为:%d",sum);
  27. return 1;
  28. }
  29. int main()
  30. {
  31. int a[3][4]={{2,5,8,7},{4,6,7,8},{3,1,5,2}};
  32. int b[4][4]={{2,5,8,7},{4,6,7,8},{3,1,5,2},{3,1,5,2}};
  33. int c[3][3]={{2,5,8},{4,6,7},{3,1,5}};
  34. // getSum(a,3,4);
  35. // getSum(b,4,4);
  36. getSum(c,3,3);
  37. return 1;
  38. }

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

  1. #include<stdio.h>
  2. #include<string.h>
  3. void fun(char *s)
  4. {
  5. int i;
  6. //\0为结束字符
  7. int num_count = 0;
  8. int char_count = 0;
  9. int else_count = 0;
  10. for(i=0;s[i]!='\0';i++){
  11. if(s[i]>='0'&& s[i]<='9'){
  12. num_count++;
  13. }else if(s[i]>='a'&& s[i]<='z'){
  14. char_count++;
  15. }else if(s[i]>='A'&& s[i]<='Z'){
  16. char_count++;
  17. }else{
  18. else_count++;
  19. }
  20. }
  21. printf("字符串中数字数量为:%d",num_count);
  22. printf("字符串中字母数量为:%d",char_count);
  23. printf("字符串中其它数量为:%d",else_count);
  24. }
  25. int main()
  26. {
  27. char str[100];
  28. printf("请输入字符串:");
  29. gets(str);
  30. fun(str);
  31. return 0;
  32. }

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

  1. #include <stdio.h>
  2. #include <string.h>
  3. #define max 100
  4. struct people {
  5. char name[10];//候选人姓名
  6. int count;//得票数量
  7. }person[max];
  8. //初始化候选人信息的函数 10个候选人
  9. void initVoteInfo(){
  10. for(int i=0;i<10;i++){
  11. printf("输入候选人姓名:");
  12. //赋值
  13. scanf("%s",&person[i].name);
  14. person[i].count = 0;
  15. }
  16. }
  17. //插入投票信息的函数 n为投票人数
  18. void insertVoteInfo(int n){
  19. for(int i=0;i<n;i++){
  20. char namestr[10];//候选人姓名
  21. printf("输入得票的候选人:");
  22. //赋值
  23. scanf("%s",namestr);
  24. for(int j=0;j<10;j++){
  25. //判断字符串是否相等
  26. if(strcmp(person[j].name, namestr) == 0){
  27. person[j].count = person[j].count + 1;
  28. }
  29. }
  30. }
  31. }
  32. //输出每个候选人投票结果
  33. void getVoteInfo(){
  34. for(int i=0;i<10;i++){
  35. printf("---候选人:%s得票数量为:%d\n",person[i].name,person[i].count);
  36. }
  37. }
  38. int main(){
  39. //初始化
  40. printf("----------------开始录入基础信息----------------\n");
  41. initVoteInfo();
  42. printf("----------------基础信息录入完毕----------------\n");
  43. printf("------------------开始投票信息------------------\n");
  44. //投票
  45. int n;
  46. printf("输入投票的总人数:");
  47. scanf("%d",&n);
  48. insertVoteInfo(n);
  49. printf("------------------结束投票信息------------------\n");
  50. //输出结果
  51. printf("------------------投票信息如下------------------\n");
  52. getVoteInfo();
  53. return 1;
  54. }

16年真题编程题答案

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

  1. #include<stdio.h>
  2. #include<string.h>
  3. void fun(char *s)
  4. {
  5. int i,j=0;
  6. //\0为结束字符
  7. for(i=0;s[i]!='\0';i++)
  8. {
  9. if(s[i]<'0'||s[i]>'9')
  10. {
  11. //重新给S进行赋值
  12. s[j++] = s[i];
  13. }
  14. }
  15. s[j]='\0';
  16. printf("删除后的为:%s",s);
  17. }
  18. int main()
  19. {
  20. char str[100];
  21. printf("请输入字符串:");
  22. gets(str);
  23. fun(str);
  24. return 0;
  25. }

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

  1. #include <stdio.h>
  2. #include <string.h>
  3. int fun(char *s,int n)
  4. {
  5. if(n<0 || n>9){
  6. printf("第二个参数越界");
  7. return -1;
  8. }
  9. char p;
  10. p = n +' 0';//数字转字符串
  11. int sum = 0;
  12. //\0为结束字符
  13. for(int i=0;s[i]!='\0';i++)
  14. {
  15. if(s[i] == p)
  16. {
  17. sum++;
  18. }
  19. }
  20. printf("相同个数为:%d",sum);
  21. return 0;
  22. }
  23. int main()
  24. {
  25. char str[100];
  26. int i,n;
  27. printf("请输入整数字符串:");
  28. gets(str);
  29. n=strlen(str);
  30. for(i=0;i<n;i++)
  31. {
  32. if(str[i]<'0'||str[i]>'9')
  33. {
  34. printf("\n输入有误,不是整数。\n");
  35. break;
  36. }
  37. }
  38. printf("请输入对比数字n:");
  39. scanf("%d",&n);//接收数据
  40. return fun(str,n);
  41. }

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

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

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

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

  1. #include <stdio.h>
  2. #include <string.h>
  3. #define max 128
  4. struct student {
  5. char studentcode[10];
  6. int normalcount;//正常次数
  7. int latecount;//迟到次数
  8. int leavecount;//请假次数
  9. int absentcount;//旷课次数
  10. }person[max];
  11. //插入学生信息的函数
  12. void insertStudentInfo(int n){
  13. for(int i=0;i<n;i++){
  14. printf("输入学生的学号 正常上课次数 迟到次数 请假次数 旷课次数:%s%d%d%d%d\n");
  15. //赋值
  16. scanf("%s%d%d%d%d",&person[i].studentcode,
  17. &person[i].normalcount,&person[i].latecount,
  18. &person[i].leavecount,&person[i].absentcount);
  19. }
  20. }
  21. //根据学号获取某个学生的相关信息
  22. void getStudentInfo(int n,int sum,char *s){
  23. for(int i=0;i<n;i++){
  24. //判断字符是否相等
  25. if(strcmp(person[i].studentcode, s) == 0){
  26. printf("学号为%s的学生上课情况如下:\n",person[i].studentcode);
  27. printf(" 上课率为:%2f,旷课率:%2f\n",
  28. (float)(person[i].normalcount+person[i].latecount)/sum,
  29. (float)person[i].absentcount/sum);
  30. }
  31. }
  32. }
  33. //获取所有学生的相关信息
  34. void getAllStudentInfo(int n,int sum){
  35. int allincount = 0;
  36. int allabsentcount = 0;
  37. for(int i=0;i<n;i++){
  38. allincount = allincount + person[i].normalcount+person[i].latecount;
  39. allabsentcount = allabsentcount + person[i].absentcount;
  40. }
  41. printf("所有学生上课情况如下:\n");
  42. printf(" 上课率为:%2f,旷课率:%2f\n",
  43. (float)allincount/(sum*n),
  44. (float)allabsentcount/(sum*n));
  45. }
  46. int main(){
  47. int n,sum;
  48. printf("----------------开始录入基础信息----------------\n");
  49. printf("输入学生的总人数:");
  50. scanf("%d",&n);
  51. printf("输入总上课次数:");
  52. scanf("%d",&sum);
  53. printf("----------------基础信息录入完毕----------------\n");
  54. printf("----------------开始录入学生信息----------------\n");
  55. insertStudentInfo(n);
  56. printf("----------------学生信息录入完毕----------------\n");
  57. char str[10];
  58. printf("请输入要查询的学生学号:");
  59. scanf("%s",&str);
  60. getStudentInfo(n,sum,str);
  61. getAllStudentInfo(n,sum);
  62. return 0;
  63. }

17年编程题答案

应用题第八题

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

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

 

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

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

  1. #include <stdio.h>
  2. //折半查找
  3. void halfSearch(int A[],int n){
  4. int low=0,high=9,mid;//high = A的长度
  5. bool flag = false;
  6. //折半查找
  7. while(low<=high){
  8. mid = (low+high)/2;
  9. if(A[mid] == n){
  10. printf("---%d所在位置为:%d",n,(mid+1));
  11. flag = true;
  12. }
  13. if(A[mid]>n)
  14. high = mid - 1;
  15. else low = mid + 1;
  16. }
  17. if(!flag){
  18. printf("---未找到所查元素");
  19. }
  20. }
  21. int main(){
  22. int A[9] = {0,13,27,38,49,49,65,76,97};
  23. halfSearch(A,38);
  24. return 0;
  25. }

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

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <malloc.h>
  4. #define STACKSIZE 100
  5. typedef int ElemType;
  6. typedef struct
  7. {
  8. ElemType stack[STACKSIZE];
  9. int top[2];
  10. }SSeqStack;
  11. void InitStack(SSeqStack *S)//初始换栈
  12. {
  13. S->top[0] = 0;
  14. S->top[1] = STACKSIZE-1;
  15. }
  16. int StackEmpty(SSeqStack S,int flag)//判断栈是否为空
  17. {
  18. switch(flag)
  19. {
  20. case 0:
  21. if(S.top[0] == 0)
  22. {
  23. return 1;
  24. }
  25. break;
  26. case 1:
  27. if(S.top[1] == STACKSIZE-1)
  28. {
  29. return 1;
  30. }
  31. break;
  32. default:
  33. return 0;
  34. }
  35. return 0;
  36. }
  37. int GetTop(SSeqStack S,ElemType *e,int flag)//取栈顶元素
  38. {
  39. switch(flag)
  40. {
  41. case 0:
  42. if(S.top[0] == 0)
  43. {
  44. return 0;
  45. }
  46. *e = S.stack[S.top[0]-1];
  47. break;
  48. case 1:
  49. if(S.top[1] == STACKSIZE-1)
  50. {
  51. return 0;
  52. }
  53. *e = S.stack[S.top[1]+1];
  54. break;
  55. default:
  56. return 0;
  57. }
  58. return 1;
  59. }
  60. int PushStack(SSeqStack *S,ElemType e,int flag)//入栈
  61. {
  62. if(S->top[0] == S->top[1])
  63. {
  64. return 0;
  65. }
  66. switch(flag)
  67. {
  68. case 0:
  69. S->stack[S->top[0]] = e;
  70. S->top[0]++;
  71. break;
  72. case 1:
  73. S->stack[S->top[1]] = e;
  74. S->top[1]--;
  75. break;
  76. default:
  77. return 0;
  78. }
  79. return 1;
  80. }
  81. int PopStack(SSeqStack *S,ElemType *e,int flag)//出栈
  82. {
  83. switch(flag)
  84. {
  85. if(S->top[0] == 0 )
  86. {
  87. return 0;
  88. }
  89. case 0:
  90. S->top[0]--;
  91. *e = S->stack[S->top[0]];
  92. break;
  93. case 1:
  94. if(S->top[1] == STACKSIZE-1)
  95. {
  96. return 0;
  97. }
  98. S->top[1]++;
  99. *e = S->stack[S->top[1]];
  100. break;
  101. default:
  102. return 0;
  103. }
  104. return 1;
  105. }
  106. int StackLength(SSeqStack S)//求栈长度
  107. {
  108. return S.top[0]+S.top[1];
  109. }
  110. void ClearStack(SSeqStack *S)//清空栈
  111. {
  112. S->top[0] = 0;
  113. S->top[1] = STACKSIZE-1;
  114. }
  115. //设有两个栈S1和S2都采用顺序栈的方式存储,并且共享一个存储区。
  116. int main(void)
  117. {
  118. SSeqStack S;
  119. int i;
  120. ElemType a[] = {'a','b','c','d','e'};
  121. ElemType b[] = {'x','y','z','r'};
  122. ElemType e1,e2;
  123. InitStack(&S);
  124. for(i = 0;i < sizeof(a)/sizeof(a[0]);i++)
  125. {
  126. if(PushStack(&S,a[i],0) == 0)
  127. {
  128. printf("栈已满,不能进栈!");
  129. return 0;
  130. }
  131. }
  132. for(i = 0;i < sizeof(b)/sizeof(b[0]);i++)
  133. {
  134. if(PushStack(&S,b[i],1) == 0)
  135. {
  136. printf("栈已满,不能进栈!");
  137. return 0;
  138. }
  139. }
  140. if(GetTop(S,&e1,0) == 0)
  141. {
  142. printf("栈已空!");
  143. return 0;
  144. }
  145. if(GetTop(S,&e2,1) == 0)
  146. {
  147. printf("栈已空!");
  148. return 0;
  149. }
  150. printf("左端栈栈顶元素是:%c,右端栈栈顶元素是:%c\n",e1,e2);
  151. printf("左端栈元素的出栈顺序是:");
  152. while(!StackEmpty(S,0))
  153. {
  154. PopStack(&S,&e1,0);
  155. printf("%4c",e1);
  156. }
  157. printf("\n");
  158. printf("右端栈元素的出栈顺序是:");
  159. while(!StackEmpty(S,1))
  160. {
  161. PopStack(&S,&e2,1);
  162. printf("%4c",e2);
  163. }
  164. printf("\n");
  165. return 0;
  166. }

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”,输出格式不限制。

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


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

  1. #include <stdio.h>
  2. #include <string.h>
  3. #define max 128
  4. struct student {
  5. char studentname[10];
  6. int score;//学生得分
  7. }person[max];
  8. //插入学生信息的函数
  9. void insertStudentInfo(int n){
  10. for(int i=0;i<n;i++){
  11. printf("输入学生的姓名 分数: \n");
  12. //赋值
  13. scanf("%s%d",&person[i].studentname,
  14. &person[i].score);
  15. }
  16. }
  17. //稳定排序 选择冒泡
  18. void scoreSort(int n){
  19. for(int i=0;i<n-1;i++){
  20. for(int j=n-1;j>i;j--){
  21. if(person[j-1].score<person[j].score){
  22. //交换
  23. char studentname_temp[10];
  24. //C语言中字符串复制 strcpy(目标,源)
  25. strcpy(studentname_temp,person[j].studentname);
  26. int score_temp = person[j].score;
  27. person[j].score = person[j-1].score;
  28. strcpy(person[j].studentname,person[j-1].studentname);
  29. person[j-1].score = score_temp;
  30. strcpy(person[j-1].studentname,studentname_temp);
  31. }
  32. }
  33. }
  34. //输出
  35. printf("排序结果如下:\n");
  36. for(int i=0;i<n;i++){
  37. printf("%s %d\n",person[i].studentname,person[i].score);
  38. }
  39. }
  40. int main(){
  41. int n,sum;
  42. printf("----------------开始录入基础信息----------------\n");
  43. printf("输入学生的总人数:");
  44. scanf("%d",&n);
  45. printf("----------------基础信息录入完毕----------------\n");
  46. printf("----------------开始录入学生信息----------------\n");
  47. insertStudentInfo(n);
  48. printf("----------------学生信息录入完毕----------------\n");
  49. //排序
  50. scoreSort(n);
  51. return 0;
  52. }


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

  1. #include <stdio.h>
  2. #include <stdlib.h>//system("pause")
  3. int main()
  4. {
  5. //total总天数,leap用于闰年的2月天数
  6. int year,month,day,total,leap;
  7. printf("请输入年月日(按顺序,中间用空格隔开):");
  8. scanf("%d%d%d",&year,&month,&day);
  9. if((year%4==0&&year%100!=0)||year%400==0)//判断是否闰年,闰年2月多一天,所以闰年leap为1,平年为leap为0。
  10. {
  11. leap=1;
  12. }else
  13. {
  14. leap=0;
  15. }
  16. //根据月份计算对应的最终天数。
  17. switch(month)
  18. {
  19. case 1:total=day;break;
  20. case 2:total=31*1+day;break;
  21. case 3:total=31*1+28+leap+day;break;
  22. case 4:total=31*2+28+leap+day;break;
  23. case 5:total=31*2+28+leap+30*1+day;break;
  24. case 6:total=31*3+28+leap+30*1+day;break;
  25. case 7:total=31*3+28+leap+30*2+day;break;
  26. case 8:total=31*4+28+leap+30*2+day;break;
  27. case 9:total=31*5+28+leap+30*2+day;break;
  28. case 10:total=31*5+28+leap+30*3+day;break;
  29. case 11:total=31*6+28+leap+30*3+day;break;
  30. case 12:total=31*6+28+leap+30*4+day;break;
  31. //12月之前的11个月中有6个31天,4个30天,2月为28天+leap。
  32. }
  33. if(year>=1&&year<=3000&&month>=1&&month<=12&&day>=1&&day<=31)//判断输入是否正解,年份最大为9999,可自行更改。
  34. {
  35. printf("%d月%d日止,%d年已过去%d天。\n",month,day,year,total);
  36. system("pause");//按任意键继续...
  37. }else{
  38. printf("错误\n");
  39. system("pause");//按任意键继续...
  40. }
  41. return 0;
  42. }


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

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

  1. #include <stdio.h>
  2. //具体做法就是穷举,也就是把所有情况穷举出来,就是用for循环
  3. //所有情况下的一个是把指定 M个球放到N个箱里,
  4. //也就是说N个箱每个箱都最少有一个球,这个功能由int fun(int m,int n);完成
  5. //把 1个 ,2个, ·····n个的情况相加
  6. int f(int m,int n)
  7. {
  8. int sum = 0;
  9. int i=1;
  10. if(n>m) n=m;
  11. if((m==1)||(n==1)) return 1;
  12. for(i=1;i<=n;++i)
  13. sum+=fun(m,i);
  14. return sum;
  15. }
  16. //也就是说N个箱每个箱都最少有一个球
  17. //也就是说把M个球必须放到N个箱里
  18. //第一步就是把M个球拿出N个放到N个箱里,每一个箱子一个
  19. //第二部是把剩下的M-N个 随机放到N个箱子里
  20. int fun(int m,int n)
  21. {
  22. if((n==1)||(n==m))return 1;
  23. return f(m-n,n);
  24. }
  25. int main(){
  26. printf("分配方法数目 = %d",f(7,7));
  27. return 0;
  28. }

19年真题编程题答案

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

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

应用题第五题第四问:

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

  1. //二叉链表类型定义
  2. typedef struct BiTNode {
  3. TElemType data;
  4. BiTNode *lchild, *rchild;
  5. } BiTNode, *BiTree;
  6. //实现函数
  7. Status Similar(BiTree t1, BiTree t2)
  8. /* 判断两棵二叉树是否相似的递归算法 */
  9. {
  10. if(!t1 && !t2)//同为空时,两树相似
  11. return TRUE;
  12. else if(t1 && t1){
  13. if(Similar(t1 -> lchild,t2 -> lchild) && Similar(t1 -> rchild,t2 -> rchild))
  14. //两树都不为空时,判断左右子树是否相似
  15. return TRUE;
  16. else
  17. return FALSE;
  18. }else//以上两种情况都不符合,就直接返回FALSE
  19. return FALSE;
  20. }

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

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

  1. #include <stdio.h>
  2. #define max 128
  3. struct point {
  4. int x_point;//x坐标值
  5. int y_point;//y坐标值
  6. }location[max];
  7. /**
  8. 问题分析:
  9. 长方形左下角坐标为x最小值 y最小值
  10. 右上角坐标为x最大值 y最大值
  11. */
  12. //插入坐标
  13. void insertPoint(int i,int x_point,int y_point){
  14. location[i].x_point = x_point;
  15. location[i].y_point = y_point;
  16. }
  17. //横坐标从小到大排 纵坐标从小到大排
  18. void sort_fun(int n){
  19. for(int i=0;i<n-1;i++){
  20. for(int j=n-1;j>i;j--){
  21. if(location[j-1].x_point>location[j].x_point){
  22. //交换 x
  23. int x_point_temp = location[j].x_point;
  24. location[j].x_point = location[j-1].x_point;
  25. location[j-1].x_point = x_point_temp;
  26. }
  27. if(location[j-1].y_point>location[j].y_point){
  28. //交换 y
  29. int y_point_temp = location[j].y_point;
  30. location[j].y_point = location[j-1].y_point;
  31. location[j-1].y_point = y_point_temp;
  32. }
  33. }
  34. }
  35. }
  36. int main(){
  37. int i = 0;
  38. printf("---------------开始输入坐标信息--------------\n");
  39. bool flag = true;//结束标识
  40. while(flag){
  41. int x_point,y_point;
  42. printf("输入坐标,以空格隔开,输入0 0 表示结束:");
  43. scanf("%d%d",&x_point,&y_point);
  44. if(x_point !=0 && y_point !=0){
  45. insertPoint(i,x_point,y_point);
  46. i=i+1;
  47. }else{
  48. flag = false;
  49. }
  50. }
  51. printf("---------------结束输入坐标信息--------------\n");
  52. sort_fun(i);
  53. printf("长方形左下角坐标为:(%d,%d)",location[0].x_point,location[0].y_point);
  54. printf("长方形右上角坐标为:(%d,%d)",location[i-1].x_point,location[i-1].y_point);
  55. return 0;
  56. }

 

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

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

  1. #include <stdio.h>
  2. #include <string.h>
  3. //非递归算法
  4. void noRecursion(char *str){
  5. int len,i;
  6. len=strlen(str);
  7. for(i=0;i<len/2;i++){
  8. if(str[i]!=str[len-1-i])
  9. break;
  10. }
  11. printf("非递归算法检测如下:");
  12. if(i==(len/2)){
  13. printf("%s是回文串\n",str);
  14. }else{
  15. printf("%s不是回文串\n",str);
  16. }
  17. }
  18. //递归算法
  19. bool ispal(char *s,int x,int y){
  20. if(y-x<=1) return true;
  21. return s[x]==s[y-1] && ispal(s,x+1,y-1);
  22. }
  23. int main()
  24. {
  25. char str[100];
  26. printf("字符串:");
  27. gets(str);
  28. //非递归算法
  29. noRecursion(str);
  30. int length = strlen(str);
  31. //递归算法
  32. bool flag = ispal(str,0,length);
  33. printf("递归算法检测如下:");
  34. if(flag){
  35. printf("%s是回文串\n",str);
  36. }else{
  37. printf("%s不是回文串\n",str);
  38. }
  39. return 0;
  40. }

 


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个。
要求:利用空间策略;算法数据结构;写出算法步骤和代码。

  1. #include <stdio.h>
  2. /**
  3. 归并排序求逆对数 时间复杂度为O(nlogn)
  4. temp为辅助数组
  5. */
  6. void merge(int arr[],int start,int mid,int end,int temp[],long long *count){
  7. int index = 0,index1 = 0,index2 = 0;
  8. index = 0; index1 = start; index2 = mid+1;
  9. while((index1<=mid) && (index2<=end)){
  10. if(arr[index1] <= arr[index2]){
  11. temp[index++] = arr[index1++];
  12. }else{
  13. temp[index++] = arr[index2++];
  14. //ans+=e1-p1+1;
  15. (*count) = (*count) + mid - index1 + 1;
  16. for(int m =start;m<index2-1;m++){
  17. if(arr[index2-1]<arr[m]){
  18. printf("(%d,%d) ",arr[m],arr[index2-1]);
  19. }
  20. }
  21. }
  22. }
  23. //第一个表未检测完 复制
  24. while(index1<=mid)
  25. temp[index++] = arr[index1++];
  26. //第二个表未检测完 复制
  27. while(index2<=end)
  28. temp[index++] = arr[index2++];
  29. for(int i=0;i<index;i++){
  30. // 复制也是递归进行的,所以并不是从start开始到end
  31. arr[start+i] = temp[i];
  32. }
  33. }
  34. void mergeSort(int arr[],int start,int end,int temp[],long long *count){
  35. if(start<end){ // 递归出口
  36. int mid = 0;
  37. mid = (start+end)/2;//从中间划分两个子序列
  38. mergeSort(arr,start,mid,temp,count);//左侧递归归并
  39. mergeSort(arr,mid+1,end,temp,count);//右侧递归归并
  40. merge(arr,start,mid,end,temp,count);//归并
  41. }
  42. }
  43. int main()
  44. {
  45. long long count = 0;
  46. int m = 5;
  47. int *a = new int[m];
  48. printf("输入五个数以空格隔开:");
  49. for(int i=0;i<m;i++){
  50. scanf("%d",&a[i]);
  51. }
  52. printf("逆对数如下:\n");
  53. int *temp = new int[m];
  54. mergeSort(a,0,m-1,temp,&count);
  55. delete []a;
  56. delete []temp;
  57. printf("逆对数有%d对",count);
  58. return 0;
  59. }

20年编程题答案

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

  1. #include <stdio.h>
  2. /**
  3. a、b、c、d四个0-9的数字,输出所有使得abcd+cadb=9102的abcd数字
  4. */
  5. void findFunction(){
  6. int num_1,num_2;
  7. int i=0;
  8. int a,b,c,d;
  9. printf("所有使得abcd+cadb=9102的abcd数字如下:\n");
  10. for(a=0;a<9;a++){
  11. for(b=0;b<9;b++){
  12. for(c=0;c<9;c++){
  13. for(d=0;d<9;d++){
  14. num_1 = a*1000+b*100+c*10+d;
  15. num_2 = c*1000+a*100+d*10+b;
  16. if((num_1+num_2) == 9102){
  17. printf("-----------第%d组------\n",(i+1));
  18. printf("---%d:",a);
  19. printf("---%d:",b);
  20. printf("---%d:",c);
  21. printf("---%d:",d);
  22. i++;
  23. }
  24. }
  25. }
  26. }
  27. }
  28. printf("------程序运行结束,共有%d个.\n",i);
  29. }
  30. int main(){
  31. findFunction();
  32. return 1;
  33. }

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

  1. #include <stdio.h>
  2. //取反函数
  3. int reverse(int x)
  4. {
  5. int s = 0;
  6. if(x<0)
  7. {
  8. printf("数字不可以为负数;\n");
  9. return 0;
  10. }
  11. while(x>0)
  12. {
  13. s = s*10+x%10;
  14. x = x/10;
  15. }
  16. return s ;
  17. }
  18. int main()
  19. {
  20. int a,b;
  21. printf("输入a和b,以空格隔开:");
  22. scanf("%d%d",&a,&b);
  23. int a_reverse = reverse(a);
  24. int b_reverse = reverse(b);
  25. int sum = a+b;
  26. int sum_reverse = reverse(sum);
  27. if(sum_reverse == (a_reverse+b_reverse)){
  28. printf("%d,%d可以使反的和等于和的反",a,b);
  29. }
  30. return 0;
  31. }

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

 

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号