近几天准备调剂的事情,原本想调个研究所什么的,后来突然觉得去软院也不错,于是就看了下软院复试相关资料,在这里把一些上机题收集一下,大都比较简单,只是为了后面的筒子有个了解。(PS:这里有必要吐槽一下杀千刀的国家线,丫的一难产!!!!)
1.打印出所有的“水仙花数”,所谓“水仙花数”是指一个3位数,其各位数字立方和等于该数本身。(举例:153=1*1*1+3*3*3+5*5*5)
#include "stdio.h" #include "stdlib.h" void main() { int i,j,k,m,n; for(i=100;i<=999;i++) { j=i%10; m=i/100; k=((i%100)-j)/10; if(i==j*j*j+m*m*m+k*k*k) printf("%d/n",i); } system("pause"); }
2.求数列s(n)=s(n-1)+s(n-2)的第n项的值。其中s(1)=s(2)=1。要求任意给定n,输出s(n)。
这里只是一个简单的递归过程就OK了...
#include"stdio.h" void main() { int n; long int fun(int k); printf("please input a number(>=1):"); scanf("%d",&n); printf("/nS(%d)=%ld/n",n,fun(n)); system("pause"); } long int fun(int k) { long int sum; if(k==3) sum=2; else if(k==1||k==2) sum=1; else sum=fun(k-1)+fun(k-2); return(sum); }
3.假设已知一棵二叉树S的先序和中序遍历序列,请编程求解这棵二叉树并输出它的后序遍历序列。
(举例:pred[]/先序:A、B、D、E、C、F、G;inod[]/中序:D、B、E、A、C、G、F;后序遍历序列是:D、E、B、G、F、C、A)
#include #include typedef struct NODE { char * p; struct NODE * lchild; struct NODE * rchild; } node ; char pred[]="ABDECFG"; char inod[]="DBEACGF"; char *p=pred;//p为全局指针 void fun(node * root, int a,int b); int find(char *p); void lastorder(node * last_root); void main() { node * last_root; node * root=(node *)malloc(sizeof(node)); root->p=p; root->lchild=NULL; root->rchild=NULL; last_root=root; fun(root,1,7); printf("pred:%s/n",pred); printf("inod:%s/n",inod); lastorder(last_root);//后续遍历 printf("/n"); } void fun(node * root, int a,int b) { if(a<=b && *p) { int m=find(p);//找出p节点在inod[]中的位置 if(find(p)p))//如果新节点在根节点的左边,则其为根结点的左孩子 { node * new_node=(node *)malloc(sizeof(node));//给新节点分配空间 new_node->p=p; new_node->lchild=NULL; new_node->rchild=NULL; root->lchild=new_node;//新节点为根结点左孩子 p++;//节点右移 root=new_node;//从新设置根节点 }else if(find(p)>find(root->p))//如果新节点在根节点的右边,则其为根结点的右孩子 { node * new_node=(node *)malloc(sizeof(node));//给新节点分配空间 new_node->p=p; new_node->lchild=NULL; new_node->rchild=NULL; root->rchild=new_node;//新节点为根结点右孩子 p++;//节点右移 root=new_node;//从新设置根节点 }else//如果新节点即为根节点(即初始情况) { p++; } fun(root,a,m-1);//左子问题 fun(root,m+1,b);//右子问题 } } int find(char *q) { int count=1; while(inod[count-1]!=*q) { count++; } return count; } void lastorder(node * last_root) { if(last_root) { lastorder(last_root->lchild); lastorder(last_root->rchild); printf("%c",*(last_root->p)); } }
4.给定任意两组字符串s1和s2,请编程输出他们间的最大相同字串。
(举例:s1=12abc78 s2=7bc2, 输出为:bc)
#include "stdio.h" #include "string.h" void main() { char s1[100]; char s2[100]; char s[100]; char ss[100]; int i,j,m,n,k; int num=0; printf("input s1:"); scanf("%s",s1); printf("/ninput s2:"); scanf("%s",s2); for(i=0;s1[i]!='/0';i++) { for(j=0;s2[j]!='/0';j++) { k=0; m=i; n=j; while(s1[m]==s2[n]) { s[k++]=s1[m]; m++; n++; } if(k>num) { s[k]='/0'; num=k; strcpy(ss,s); } } } printf("/nresult is :%s/n",ss); }
5.在半个中国象棋棋盘上,马在左上角(1,1)处,马走日字...而且只能往右走...不能向左...可上可下...求从起点到(m, n)处有几种不同的走法。
#include const int maxstep=9; int target_x; int target_y; int num; int path[maxstep][2]; int dx[]={0,1,2,2,1}; int dy[]={0,2,1,-1,-2}; int mk[maxstep]; void jump(int x,int y,int step) { int k,i,j; int t1,t2,t3,t4; int x1,y1; for(k=1;k<=4;k++) { x1=x+dx[k]; y1=y+dy[k]; /*4种跳步方向*/ t1=(x1>0)&&(x1<=target_x); t2=(y1>0)&&(y1<=target_y); /*保持x1,y1在界内*/ t3=(x1==target_x)&&(y1!=target_y); /*x1到位y1不到位(此条可删除,只是减少循环次数)*/ t4=(x1==target_x)&&(y1==target_y); //判断x1,y1到位 if((t1)&&(t2)&&(!t3)) { path[step][0]=x1; path[step][1]=y1; mk[step]=k; //保存每步信息 if(t4) //x1,y1到位 { num++; printf("num:%-2d",num); printf(" road:"); for(i=0;i<=step;i++) { printf("%3d,%d",path[i][0],path[i][1]); } printf("/n"); printf(" mothed:"); for(i=1;i<=step;i++) { j=mk[i]; printf("%3d,%d",dx[j],dy[j]); } printf("/n/n"); //输出方案 } else { jump(x1,y1,step+1); //下一步 } } } } void main() { loopx:printf("please input target_x(1-9):"); //此处只是为了保持程序的完整性,可删减。 scanf("%d",&target_x); if(!(target_x<=9&&target_x>=1)) { printf("warning:the target_x is must between 1 and 9/n"); goto loopx; } else loopy:printf("please input target_y(1-5):"); scanf("%d",&target_y); if(!(target_y<=5&&target_y>=1)) { printf("warning:the target_y is must between 1 and 5/n"); goto loopy; } else printf("/n"); mk[0]=0; num=0; path[0][0]=1; path[0][1]=1; jump(1,1,1); printf("/n"); printf("总方案数:%d/n",num); }
6.将ss所指字符串中所有下标为奇数位置的字母转换为大写(若该位置上不是字母,则不转换)。
(举例:若输入abc4Efg,则应输出aBc4EFg)
#include "stdio.h" void main() { char s[100]; int i; printf("please input :/n"); scanf("%s",s); for(i=1;s[i]!='/0';) { if(s[i]>='a'&&s[i]<='z') s[i]=s[i]-32; i=i+2; } printf("%s",s); }
软院每年上机题也就两道或者三道,共20分,一般都是简单题占的分值比较多,所以基本上不会太难,等2011复试完后我再把题目给搬上来,加油......