清华大学计算机06考研上机题
只有系统结构方向参加上机, 3 月 27 日 2:00——4:00
总述:用文件Input.txt输入,用文件Output.txt输出。编程环境只能用VC,没有MSDN,不能上网,不能查资料。
题目1:求N的阶乘。(25分,5组数据)
Input.txt
4
Output.txt
24
Input.txt
15
Output.txt
1307674368000
解答:(自己编写的)
#include <fstream.h>
#define MAXN 3000
int LongNum[MAXN+1];
void mul(int b)
{
int i,carry=0;
for(i=1;i<=LongNum[0];i++)
{
int temp;
temp=LongNum[i]*b+carry;
LongNum[i]=temp%10;
carry=temp/10;
}
while(carry)
{
LongNum[++LongNum[0]]=carry%10;
carry/=10;
}
}
void main()
{
LongNum[0]=1;
LongNum[1]=1;
int i,b;
ifstream fin("Input.txt");
fin>>b;
fin.close();
for(i=2;i<=b;i++)
mul(i);
ofstream fout("Output.txt");
for(i=LongNum[0];i>0;i--)
{
fout<<LongNum[i];
}
}
总结:由于乘出来的数很大,必须用数组操作,据说最后一组的测试数据为1000,所以数组长度最少得2567位。
题目2:(最大和连续子串)给定一串序列,求其一个连续子序列,使其和最大,输出这个和(35分,7组测试数据)
Input.txt
4
-1 -2 -3 -4
Output.txt
-1
Input.txt
5
1 2 3 4 5
Output.txt
15
Input.txt
6
23 34 -23 45 6 -7
Output.txt
85
解答:
program2.cpp
#include <fstream.h>
#define MINNUM -32768
void main()
{
int n;
ifstream fin("Input.txt");
fin>>n;
int * a=new int[n];
for(int i=0;i<n;i++)
fin>>a[i];
fin.close();
int sum=0,maxsum=MINNUM;
for(i=0;i<n;i++)
{
sum+=a[i];
if(sum>maxsum)
maxsum=sum;
if(sum<0)
sum=0;
}
ofstream fout("Output.txt");
fout<<maxsum;
fout.close();
}
总结:此题难点在必须使算法复杂度为O(n),如果用穷举法,复杂度为O(n2).只能通过两组数据后五组全为超时。
题目3:给出儿BiTree的前序遍历,和中序遍历,输出后序遍历。(40分,8组测试数据)
Input.txt
ABC
BAC
Output.txt
BCA
Input.txt
ABCD
BDAC
Output.txt
NO ANSWER
解答:
program3.cpp
#include <fstream.h>
#define MAXN 100
char A[MAXN];
class BiNode
{
public:
BiNode(char d):data(d){lchild=rchild=NULL;}
char data;
BiNode * lchild;
BiNode * rchild;
};
int FindInArray(int low,int high,int point)
{
for(int i=low;i<=high;i++)
if(A[i]==A[point])
return i;
return -1;
}
int createTree(BiNode * & root,int low,int high,int & point)
{
if(low>high)
{
root=NULL;
return 1;
}
int ret;
if((ret=FindInArray(low,high,point))==-1)
return 0;
root=new BiNode(A[point]);
point++;
if(createTree(root->lchild,low,ret-1,point)&&createTree(root->rchild,ret+1,high,point))
return 1;
return 0;
}
void postorder(BiNode * root,ofstream & fout)
{
if(root)
{
postorder(root->lchild,fout);
postorder(root->rchild,fout);
fout<<root->data;
}
}
void main()
{
int count=0;
ifstream fin("Input.txt");
while(fin>>A[count])
{
count++;
}
fin.close();
BiNode * root;
int point=0;
ofstream fout("Output.txt");
if(createTree(root,count/2,count-1,point))
{
postorder(root,fout);
}
else
fout<<"NO ANSWER";
fout.close();
}
总结:考查递归编程