浙大09年复试机试题目

  做了近几年浙大的机试题,09年是最容易的一年。虽然知道做这些题目真正用到的机会渺茫,但还是会坚持做完,毕竟已经开始了,就不想中途放弃,浙大永远是我的梦...

第一题:xxx定律:数n,如果是偶数,把n砍掉一半;如果奇数,把3n+ 1砍掉一半,直到数变为1为止。测试包含多个用例,当数为0时结束。输出需要经过几步将n变到1

 

Input:

3

1

0

Output:

5

0

 我的代码:

 #include<stdio.h> int main() { int n,i; while(scanf("%d",&n)&&n!=0) { i=0; while(n!=1) { if(n%2==0) n/=2; else { n=(3*n+1)/2; } i++; } printf("%d/n",i); } return 0; }

第二题:ZOJ,读入一个字符串,字符串中包含ZOJ三个字符,个数不一定相等,按ZOJ的顺序输出,当某个字符用完时,剩下的仍然安装ZOJ的顺序输出。当读入的字符串为E时,结束。

 

Input

ZZOOOJJJ

ZZZZOOOOOJJJ

E

 

Output:

ZOJZOJOJ

ZOJZOJZOJZOO

我的代码:

#include<stdio.h> #include<string.h> int main() { char ch[105]; int zi,oi,ji,t; while(scanf("%s",ch)&&strcmp(ch,"E")!=0) { zi=oi=ji=0; for(t=0;t<(int)strlen(ch);t++) { if(ch[t]=='Z')zi++; else if(ch[t]=='O')oi++; else if(ch[t]=='J')ji++; else printf("error"); } t=zi; if(t<oi)t=oi; if(t<ji)t=ji; for(;t>0;t--) { if(zi!=0) { printf("Z"); zi--; } if(oi!=0) { printf("O"); oi--; } if(ji!=0) { printf("J"); ji--; } } printf("/n"); memset(ch,0,105); } return 0; }

 

第三题:继续xxx定律,当n3时,我们在验证xxx定律的过程中会得到一个序列,358421,将3称为关键数,5842称为覆盖数。现在输入n个数字,根据关键数与覆盖数的理论,我们只需要验证其中部分数就可以确定所有数满足xxx定律,输入输入的n个数中的关键数。

 

Input:第一行,n,第二行n个数,n0时结束

3

3 8 4

0

 

Output:有多个关键数时逆序输出

3

 

我的代码:

#include<stdio.h> int main() { int n,i,m,j,k; int d[105],t[105]; bool flg,f; while(scanf("%d",&n)&&n!=0) { for(i=0;i<105;i++) { d[i]=t[i]=0; } for(i=0;i<n;i++) { scanf("%d",&d[i]); } f = true; for(i=0;i<n;i++) { m = d[i]; t[m] = 1; while(m!=1) { if(m%2==0) { m/=2; } else { m=(3*m+1)/2; } t[m]=1; } t[1]=1; flg = true; for(j=0;j<n;j++) { if(t[d[j]]==0) { flg = false;break; } } if(flg) { if(f) { printf("%d",d[i]); f = false; } else printf(" %d",d[i]); } for(k=0;k<105;k++) t[k] = 0; } printf("/n"); for(k=0;k<105;k++) d[k] = 0; } return 0; }

 

第四题:寻找大富翁;输入n0<n<=100000),m(0<m<=10)n为小镇上的人数,m为需要找出的大富翁数。输入:

n, m 接下来一行输入小镇n个人的财富值,输出:前m个大富翁的财产数,n0时结束

 

Input:

3 1

2 5 -1

0 0

 

Output

5

 

我的代码:

#include<stdio.h> #include<algorithm> using namespace std; bool cmp(int a,int b) { if(a>=b)return true; else return false; } int main() { int n,m,i; int p[100005]; while(scanf("%d%d",&n,&m)&&n!=0) { for(i=0;i<n;i++) { scanf("%d",&p[i]); } sort(p,p+n,cmp); for(i=0;i<m;i++) { if(i==0) printf("%d",p[i]); else printf(" %d",p[i]); } printf("/n"); for(i=0;i<100005;i++) p[i]=0; } return 0; }

 

第五题: 找出直系亲属。如果ABC的父母亲,则ABCparentCABchild,如果ABC的(外)祖父,祖母,则ABCgrandparentCABgrandchild,如果ABC的(外)曾祖父,曾祖母,则ABCgreat-grandparenetCABgreat-grandchild,之后再多一辈,则在关系上加一个great-

输入:n0<=n<=26)表示n个亲属关系,形式为ABC,表示A的父母亲分别是BC,如果A的父母亲信息不全,则用-代替,例如A-Cm(。。。)代表测试用例数,形式AB。输出:AB的关系,如AB的直系亲属,按上述要求输出关系,如果AB没有关系,输出-。当n0时结束。

 

Input

3 2

ABC

CDE

EFG

FA

BE

0 0

 

Output:

great-grandparent

 

做题思路:

1。利用的是树的概念,除了添加每个节点的双亲索引外,还增加了每个节点所在的层次(leve)

2。先通过层次遍历的方式查询两个节点是否存在亲属关系,如果存在则根据leve的差确定具体的亲属关系。

附我的代码:

(拖到现在也真是够晚的...)

#include<iostream> #include<string> #include<queue> using namespace std; struct People { char r; int p1; int p2; int level; }; People p[105]; int Count; int isExist(char c) { int i; for(i=0;i<Count;i++) { if(p[i].r==c)return i; } return -1; } void FindRelation(char c1,char c2) { queue<int> q; int i,j,k,a,b,ai,bi; bool flg; a=isExist(c1); b=isExist(c2); //ai-child bi-parent if(p[a].level>p[b].level) { ai=b;bi=a; } else { ai=a;bi=b; } if(p[ai].p1!=-1) q.push(p[ai].p1); if(p[ai].p2!=-1) q.push(p[ai].p2); flg = false; while(!q.empty()) { i=q.front(); if(i==bi) { flg = true;break; } if(p[i].p1==bi) { flg = true;break; } if(p[i].p2==bi) { flg = true;break; } q.pop(); if(p[i].p1!=-1) q.push(p[i].p1); if(p[i].p2!=-1) q.push(p[i].p2); } string str1 = "grandparent"; string str2 = "grandchild"; if(flg) { if(p[a].level>p[b].level) { j= p[a].level-p[b].level; if(j==1) printf("parent/n"); else if(j==2) printf("grandparent/n"); else if(j>=3) { k=j-2; for(;k>0;k--) { str1="great-"+str1; } cout<<str1<<endl; } } else { j= p[b].level-p[a].level; if(j==1) printf("child/n"); else if(j==2) printf("grandchild/n"); else if(j>=3) { k=j-2; for(;k>0;k--) { str2="great-"+str2; } cout<<str2<<endl; } } } else printf("-/n"); } int main() { int i,j,n,m,t[4]; char s[4],cmd[3]; while(scanf("%d%d",&n,&m)&&n!=0) { Count=0; for(i=0;i<n;i++) { scanf("%s",s); for(j=0;j<3;j++) { if(s[j]=='-') t[j] = -1; else { t[j] = isExist(s[j]); if(t[j]==-1) //not exist { p[Count].r = s[j]; p[Count].p1 = -1; p[Count].p2 = -1; if(Count==0) //the below level p[Count].level = 0; else p[Count].level = -1; t[j] = Count; Count++; } } } p[t[0]].p1=t[1]; p[t[0]].p2=t[2]; if(t[1]!=-1) p[t[1]].level=p[t[0]].level+1; if(t[2]!=-1) p[t[2]].level=p[t[0]].level+1; } for(i=0;i<m;i++) { scanf("%s",cmd); FindRelation(cmd[0],cmd[1]); } for(i=0;i<105;i++) { p[i].level = -1; p[i].p1 = -1; p[i].p2 = -1; p[i].r = 0; } } return 0; }

 

你可能感兴趣的:(c,String,cmd,ini,input,output)