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

这篇博客包含了三道来自九度OJ的编程题目,分别是反序输出字符串、求解abc+bcc=532的三位数组合以及找出2到60之间的完数和盈数。博主提供了C语言的解题代码,通过输入输出示例展示了程序的正确性。
摘要由CSDN通过智能技术生成
九度OJ 题目1058:反序输出
时间限制:1 秒  内存限制:32 兆  特殊判题:否  提交:1171  解决:346
题目描述:
    输入任意4个字符(如:abcd), 并按反序输出(如:dcba)
输入:
    题目可能包含多组用例,每组用例占一行,包含4个任意的字符。
输出:
    对于每组输入,请输出一行反序后的字符串。
    具体可见样例。
样例输入:
    Upin
    cvYj
    WJpw
    cXOA
样例输出:
    nipU
    jYvc
    wpJW
    AOXc

//清华2000:题目1058:反序输出
//输入一个整数n,输出n的阶乘 (1<=n<=20)
#include <cstring>
#include <cstdio>
#include <iostream>
using namespace std;

int main()
{
	int i, j, k, n;
	char s[4];
	while( scanf("%s",s)!=EOF ){
		for( i=3; i>=0; i-- )
			printf("%c",s[i]);
		printf("\n");
	}
	return 0;
}


九度OJ 题目1059:abc
时间限制:1 秒  内存限制:32 兆  特殊判题:否  提交:423  解决:330
题目描述:
    设a、b、c均是0到9之间的数字,abc、bcc是两个三位数,且有:abc+bcc=532。求满足条件的所有a、b、c的值。
输入:
    题目没有任何输入。
输出:
    请输出所有满足题目条件的a、b、c的值。
    a、b、c之间用空格隔开。
    每个输出占一行。

//清华2000:题目1059:abc
//设a、b、c均是0到9之间的数字,abc、bcc是两个三位数,且有:abc+bcc=532。求满足条件的所有a、b、c的值。
//请输出所有满足题目条件的a、b、c的值。 a、b、c之间用空格隔开。
//显然a<=5 c=1or6
#include <iostream>
using namespace std;

int main()
{
	int a, b, k, n;
	int c[2] = { 1, 6 };
	for( a=0; a<=5; a++ )	//i=a
		for( b=0; b<10; b++ )	//j=b k=c
			for( k=0; k<2; k++ ){
				n = 100*(a+b) + 10*(b+c[k]) + 2*c[k];
				if( n == 532 )
					cout << a << " " << b << " " << c[k] << endl;
			}
	system("pause");
	return 0;
}


九度OJ 题目1060:完数VS盈数
时间限制:1 秒  内存限制:32 兆  特殊判题:否  提交:751  解决:247
题目描述:
    一个数如果恰好等于它的各因子(该数本身除外)子和,如:6=3+2+1。则称其为“完数”;若因子之和大于该数,则称其为“盈数”。
    求出2到60之间所有“完数”和“盈数”。
输入:
    题目没有任何输入。
输出:
    输出2到60之间所有“完数”和“盈数”,并以如下形式输出:
    E: e1 e2 e3 ......(ei为完数)
    G: g1 g2 g3 ......(gi为盈数)
    其中两个数之间要有空格,行尾不加空格。

//清华2000:题目1060:完数VS盈数
//一个数如果恰好等于它的各因子(该数本身除外)子和,如:6=3+2+1。则称其为“完数”;若因子之和大于该数,则称其为“盈数”。
//求出2到60之间所有“完数”和“盈数”。
#include <iostream>
using namespace std;

int main()
{
	int i, j, k, n;
	int index, sum, d[60];	//num记录d[]中非零元素个数
	int e[60], g[60];
	int eNum=0, gNum=0;
	for( i=2; i<=60; i++ ){
		index = 0;
		sum = 1;	//1是每个数的因子
		for( j=2; j<i; j++ )
			if( i % j == 0 ){
				d[index] = j;
				index++;
			}
		//cout << "i=" << i << "--";//
		for( j=0; j<index; j++ ){
			sum += d[j];
			//cout << d[j] << " ";
		}
		//cout << " sum=" << sum << endl;//
		if( sum == i ){
			e[eNum] = i;
			eNum++;
			//cout << "e=" << i << endl;//
		}
		else if( sum > i ){
			g[gNum] = i;
			gNum++;
		}
	}

	cout << "E: ";
	for( i=0; i<eNum-1; i++ )
		cout << e[i] << " ";
	cout << e[eNum-1] << endl;

	cout << "G: ";
	for( i=0; i<gNum-1; i++ )
		cout << g[i] << " ";
	cout << g[gNum-1];

	system("pause");
	return 0;
}


九度OJ 题目1061:成绩排序
时间限制:1 秒  内存限制:32 兆  特殊判题:否  提交:910  解决:188
题目描述:
        有N个学生的数据,将学生数据按成绩高低排序,如果成绩相同则按姓名字符的字母序排序,如果姓名的字母序也相同则按照学生的年龄排序,并输出N个学生排序后的信息。
输入:
        测试数据有多组,每组输入第一行有一个整数N(N<=1000),接下来的N行包括N个学生的数据。
        每个学生的数据包括姓名(长度不超过100的字符串)、年龄(整形数)、成绩(小于等于100的正数)。
输出:
        将学生信息按成绩进行排序,成绩相同的则按姓名的字母序进行排序。
        然后输出学生信息,按照如下格式:
        姓名 年龄 成绩
样例输入:
    3
    abc 20 99
    bcd 19 97
    bed 20 97
样例输出:
    bcd 19 97
    bed 20 97
    abc 20 99
提示:
    学生姓名的字母序区分字母的大小写,如A要比a的字母序靠前(因为A的ASC码比a的ASC码要小)。

//清华2000:题目1061:成绩排序
//姓名(长度不超过100的字符串)
//将学生数据按成绩高低排序,如果成绩相同则按姓名字符的字母序排序,[成绩低的靠前]
//如果姓名的字母序也相同则按照学生的年龄排序,并输出N个学生排序后的信息。
//学生姓名的字母序区分字母的大小写,如A要比a的字母序靠前(因为A的ASC码比a的ASC码要小)。
//#include <fstream>
//#include <memory.h>
#include <algorithm>
#include <string>
#include <cstring>
#include <cstdio>
#include <iostream>
using namespace std;

struct STUDENT{
	char name[100];
	int age;
	int score;
};
STUDENT s[1000];

int cmpName( char m[], char n[] ){	//返回1表示m更靠前
	int xlen = strlen(m);
	int ylen = strlen(n);
	char small;
	int minlen=xlen;
	if( xlen<ylen )
		small='x';
	else if( xlen>ylen ){
		minlen=ylen;
		small='y';
	}else small='e';
	int i, j;
	bool same = 0;
	for( i=0; i<minlen; i++ ){
		if( m[i] == n[i] ){
			if( i == minlen-1 )
				same = 1;
			else continue;
		}
		else if( m[i] < n[i] )
			return 1;
		else
			return 0;
	}
	if( same == 1 ){
		if( small=='e' )
			return 2;
		if( small=='x' )
			return 1;
		else return 0;
	}
};

bool cmp( STUDENT x, STUDENT y ){
	if( x.score == y.score ){
		int nameResult = cmpName( x.name, y.name );
		if( nameResult == 2 )
			return x.age < y.age;
		else
			return nameResult;
	}else
		return x.score < y.score;
};

int main()
{
	int i, j, k, n;
	//freopen("THU_1061.txt", "r", stdin);//
	while( scanf("%d",&n)!=EOF ){
		for( i=0; i<n; i++ )
			scanf("%s%d%d", s[i].name, &s[i].age, &s[i].score );	//char前不需加&
		sort( s, s+n, cmp );
		for( i=0; i<n; i++ )
			printf("%s %d %d\n", s[i].name, s[i].age, s[i].score );
	}
	//fclose(stdin);//
	//while(1);//
	return 0;
}
上面的是C风格的 底下的是C++风格的 有时候我就在想 要是考试时老师能把C++风格的程序因为输入输出带来的比C多出的时间测出来并减掉使得那种输入输出量很大的题目 用C++写也不超时该多好 不喜欢C的输入输出风格
//清华2000:题目1061:成绩排序
//姓名(长度不超过100的字符串)
//将学生数据按成绩高低排序,如果成绩相同则按姓名字符的字母序排序,[成绩低的靠前]
//如果姓名的字母序也相同则按照学生的年龄排序,并输出N个学生排序后的信息。
//学生姓名的字母序区分字母的大小写,如A要比a的字母序靠前(因为A的ASC码比a的ASC码要小)。
#include <fstream>
#include <algorithm>
#include <string>
#include <iostream>
using namespace std;

struct STUDENT{
	string name;
	int age;
	int score;
};
STUDENT s[1000];

bool cmpName( string m, string n ){	//返回1表示m更靠前
	int xlen = m.length();
	int ylen = n.length();
	char small;
	int minlen;
	if( xlen<ylen ){
		minlen=xlen;
		small='x';
	}else{
		minlen=ylen;
		small='y';
	}
	int i, j;
	bool same = 0;
	for( i=0; i<minlen; i++ ){
		if( m[i] == n[i] ){
			if( i == minlen-1 )
				same = 1;
			else continue;
		}
		else if( m[i] < n[i] )
			return 1;
		else
			return 0;
	}
	if( same == 1 ){
		if( small=='x' )
			return 1;
		else return 0;
	}
};

bool cmp( STUDENT x, STUDENT y ){
	if( x.score == y.score ){
		if( x.name == y.name )
			return x.age < y.age;
		else
			return cmpName( x.name, y.name );
	}else
		return x.score < y.score;
};

int main()
{
	int i, j, k, n;
	//ifstream cin("THU_1061.txt");
	while( cin >> n ){
		for( i=0; i<n; i++ )
			cin >> s[i].name >> s[i].age >> s[i].score;
		sort( s, s+n, cmp );
		for( i=0; i<n; i++ )
			cout << s[i].name << " " << s[i].age << " " << s[i].score << endl;
	}
	//system("pause");
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值