清华大学2006年复试上机题 解题报告

九度OJ 题目1076:N的阶乘
时间限制:3 秒  内存限制:128 兆   特殊判题:否  提交:1266  解决:351
题目描述:
     输入一个正整数N,输出N的阶乘。
输入:
    正整数N(0<=N<=1000)
输出:
     输入可能包括多组数据,对于每一组输入数据,输出N的阶乘
样例输入:
    4
    5
    15
样例输出:
    24
    120
    1307674368000
//清华2006:题目1076:N的阶乘
//输出N的阶乘(0<=N<=1000) 即大数乘法
#include <fstream>
#include <iostream>
#include <memory.h>
using namespace std;
int a[100000];
int length;	//a数组的实际占用长度

void mul(int *a, int b ){ // b 为乘数
	int i, tmp, carry=0;
	for( i=0; i<length; i++ ){
		tmp = a[i] * b + carry;
		a[i] = tmp % 10000;	//每个数组max=9999 运算中实际max=9999000 carry=999
		carry = tmp / 10000;
	}
	if( carry!=0 ){
		a[length] = carry;
		length++;
	}
}

int main(){
	int i, j, k, n;
	//ifstream cin("THU_1076.txt");
	while( cin >> n ){
		memset(a,0,sizeof(a));
		a[0] = 1;
		length = 1;
		for( i=2; i<=n; i++ ){
			mul( a, i );
			//逐级输出 调试用 
			//for( j=length-1; j>=0; j-- ){
			//	if( j!=length-1 ){
			//		if( a[j]<10 )
			//			cout << "000";
			//		else if( a[j]<100 )
			//			cout << "00";
			//		else if( a[j]<1000 )
			//			cout << "0";
			//	}
			//	cout << a[j];
			//}
			//cout << endl;
		}
		//ofstream out("THU_1076_output.txt");
		for( j=length-1; j>=0; j-- ){
			if( j!=length-1 ){
				if( a[j]<10 )
					cout << "000";
				else if( a[j]<100 )
					cout << "00";
				else if( a[j]<1000 )
					cout << "0";
			}// if
			cout << a[j];
		}// for
		cout << endl;
    }
    return 0;
}


九度OJ 题目1077:最大序列和
时间限制:1 秒  内存限制:32 兆  特殊判题:否  提交:553  解决:137
题目描述:
    给出一个整数序列S,其中有N个数,定义其中一个非空连续子序列T中所有数的和为T的“序列和”。
    对于S的所有非空连续子序列T,求最大的序列和。
    变量条件:N为正整数,N≤1000000,结果序列和在范围(-2^63,2^63-1)以内。
输入:
    第一行为一个正整数N,第二行为N个整数,表示序列中的数。
输出:
    输入可能包括多组数据,对于每一组输入数据,
    仅输出一个数,表示最大序列和。
样例输入:
    5
    1 5 -3 2 4
    6
    1 -2 3 4 -10 6
    4
    -3 -1 -2 -5
样例输出:
    9
    7
    -1

各种情况都要考虑到啊 包括单个输入数据可能是大数 超出int范围

//清华2006:题目1077:最大序列和
//求给定序列的最大非空连续子序列和
//N为正整数,N≤1000000,结果序列和在范围(-2^63,2^63-1)以内。
#include <fstream>
#include <iostream>
#define INT long long
using namespace std;

int main(){
	int i, n;
	INT temp, sum, b;
	ifstream cin("THU_1077.txt");
	while( cin >> n ){
		for( i=0; i<n; i++ ){
			cin >> b;
			if( i == 0 ){
				sum = b;
				temp = 0;
			}
			if( temp > 0 )
				temp += b;
			else
				temp = b;
			if( temp > sum )
				sum = temp;
		}// for
		cout << sum << endl;
	}
	system("pause");
	return 0;
}


九度OJ 题目1078:二叉树遍历
时间限制:1 秒  内存限制:32 兆  特殊判题:否  提交:159  解决:109
题目描述:
    二叉树的前序、中序、后序遍历的定义:
    前序遍历:对任一子树,先访问跟,然后遍历其左子树,最后遍历其右子树;
    中序遍历:对任一子树,先遍历其左子树,然后访问根,最后遍历其右子树;
    后序遍历:对任一子树,先遍历其左子树,然后遍历其右子树,最后访问根。
    给定一棵二叉树的前序遍历和中序遍历,求其后序遍历(提示:给定前序遍历与中序遍历能够唯一确定后序遍历)。
输入:
    两个字符串,其长度n均小于等于26。
    第一行为前序遍历,第二行为中序遍历。
    二叉树中的结点名称以大写字母表示:A,B,C....最多26个结点。
输出:
    输入样例可能有多组,对于每组测试样例,
    输出一行,为后序遍历的字符串。
样例输入:
    ABC
    BAC
    FDXEAG
    XDEFAG
样例输出:
    BCA
    XEDGAF
因为二叉树遍历几乎不会 所以参考了别人的程序 以后有时间写个自己的非递归版吧
//清华2006:题目1078:二叉树遍历 
//两个字符串,其长度n均小于等于26。 第一行为前序遍历,第二行为中序遍历。
//二叉树中的结点名称以大写字母表示:A,B,C....最多26个结点。
//输出后序遍历的字符串。
#include <fstream>
#include <string>
#include <iostream>
using namespace std;
struct BiTree{
	char a;
	BiTree* l;
	BiTree* r;
};

BiTree* process( string S, string T ){
	if( S.empty() )	
		return NULL;
	int mark = T.find(S[0]);	//t[S[0]-64];
	BiTree *b = new BiTree();	//b=binary tree
	b->a = S[0];
	b->l = process( S.substr(1,mark), T.substr(0,mark) );
	b->r = process( S.substr(mark+1,S.size()-mark-1), 
		T.substr(mark+1,T.size()-mark-1) );		
	return b;
};

void postTraverse( BiTree* b ){
	if( b != NULL ){
		if( b->l != NULL) postTraverse(b->l);
		if( b->r != NULL) postTraverse(b->r);
		cout << b->a;
	}
};

int main(){
	int i, n;
	string S, T;	//preorder inorder postorder
	ifstream cin("THU_1078.txt");
	while( cin >> S >> T ){
		BiTree *B = process( S, T );
		postTraverse( B );
		cout << endl;
	}
	system("pause");
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值