北京航空航天大学 2008年复试上机题 解题报告

这是一个关于九度在线Judge的解题报告,涵盖了三道题目:1163-素数问题,要求找出个位为1的素数;1164-旋转矩阵,判断第二个矩阵是否为第一个的旋转;1165-字符串匹配,寻找指定字符串的匹配项。代码实现分别给出了求解素数、旋转判断和字符串匹配的算法。
摘要由CSDN通过智能技术生成
九度OJ 题目1163:素数
时间限制:1 秒   内存限制:32 兆   特殊判题:否   提交:2782   解决:761
http://ac.jobdu.com/problem.php?pid=1163
题目描述:
输入一个整数n(2<=n<=10000),要求输出所有从1到这个整数之间(不包括1和这个整数)个位为1的素数,如果没有则输出-1。
输入:
输入有多组数据。
每组一行,输入n。
输出:
输出所有从1到这个整数之间(不包括1和这个整数)个位为1的素数(素数之间用空格隔开,最后一个素数后面没有空格),如果没有则输出-1。
样例输入:
100
样例输出:
11 31 41 61 71
#include <memory.h>
#include <iostream>
using namespace std;
int prime[320];
bool isPrime[10005];

int primeNumber( int n ){
	memset( isPrime, 0, sizeof(isPrime) );
	int d = 100;
	int i, j;

	for( i=2; i<6; i++ ){		//2,3,5
		if( i%4 == 0 ) continue;
		for( j=i*i; j<n; j+=i )
			isPrime[j] = 1;	//true表示非素数
	}

	for( i=7; i<=d; i+=2 ){
		if( i % 3 == 0 ) continue;
		if( i % 5 == 0 ) continue;
		for( j=i*i; j<n; j+=i )
			isPrime[j] = 1;	//1表示非素数

	}
	for( i=2, j=0; i<n; i++ )
		if( !isPrime[i] && i%10 == 1 )
			prime[j++] = i;

	return j;
}

int main(){
	int i, j, k, l, m, n;
	l = primeNumber( 10000 );
//	cout << endl << "l = " << l << endl;
//	cout << prime[l-1] << endl;
	
	while( cin >> n ){
		i = 0; 
		bool flag = 0;
		while(prime[i]<n && i<l){
			if( flag ) cout << " " << prime[i++];
			else{
				cout << prime[i++];
				flag = 1;
			}
		}
		if(!flag) cout << "-1";
		cout << endl;
	}
	return 0;
}


九度OJ 题目1164:旋转矩阵
时间限制:1 秒   内存限制:32 兆   特殊判题:否   提交:1331   解决:497
http://ac.jobdu.com/problem.php?pid=1164
题目描述:
任意输入两个9阶以下矩阵,要求判断第二个是否是第一个的旋转矩阵,如果是,输出旋转角度(0、90、180、270),如果不是,输出-1。
要求先输入矩阵阶数,然后输入两个矩阵,每行两个数之间可以用任意个空格分隔。行之间用回车分隔,两个矩阵间用任意的回车分隔。
输入:
输入有多组数据。
每组数据第一行输入n(1<=n<=9),从第二行开始输入两个n阶矩阵。
输出:
判断第二个是否是第一个的旋转矩阵,如果是,输出旋转角度(0、90、180、270),如果不是,输出-1。
如果旋转角度的结果有多个,则输出最小的那个。
样例输入:
3
1 2 3
4 5 6
7 8 9
7 4 1
8 5 2
9 6 3
样例输出:
90
//	1 2 3	7 4 1	9 8 7	3 6 9
//	4 5 6	8 5 2	6 5 4	2 5 8
//	7 8 9	9 6 3	3 2 1	1 4 7

#include <stdio.h>
int a[10][10], b[10][10];

int main()
{
	int i, j, k, m, n;
	freopen("1164.txt","r",stdin);//
	while( scanf("%d",&n) == 1 ){
		for( i=0; i<n; i++ )
			for( j=0; j<n; j++ )
				scanf("%d",&a[i][j]);
		for( i=0; i<n; i++ )
			for( j=0; j<n; j++ )
				scanf("%d",&b[i][j]);
		bool flag = 0;
		if( b[0][0] == a[0][0] )
		{
			for( i=0; i<n; i++ ){
				for( j=0; j<n; j++ )
					if(a[i][j]!=b[i][j]) { flag = 1; break;}
				if(flag) break;	
			}
			if(flag) puts("-1");
			else puts("0");
		}
		else if( b[0][n-1] == a[0][0] )
		{
			for( i=0; i<n; i++ ){
				for( j=0; j<n; j++ )
					if(a[i][j]!=b[j][n-1-i]) { flag = 1; break;}
				if(flag) break;	
			}
			if(flag) puts("-1");
			else puts("90");
		}
		else if( b[n-1][n-1] == a[0][0] )
		{
			for( i=0; i<n; i++ ){
				for( j=0; j<n; j++ )
					if(a[i][j]!=b[n-1-i][n-1-j]) { flag = 1; break;}
				if(flag) break;	
			}
			if(flag) puts("-1");
			else puts("180");
		}
		else if( b[n-1][0] == a[0][0] )
		{
			for( i=0; i<n; i++ ){
				for( j=0; j<n; j++ )
					if(a[i][j]!=b[n-1-j][i]) { flag = 1; break;}
				if(flag) break;	
			}
			if(flag) puts("-1");
			else puts("270");
		}
		else puts("-1");
	}
	return 0;
}


九度OJ 题目1165:字符串匹配
时间限制:1 秒   内存限制:32 兆   特殊判题:否   提交:1331   解决:430
http://ac.jobdu.com/problem.php?pid=1165
题目描述:
    读入数据string[ ],然后读入一个短字符串。要求查找string[ ]中和短字符串的所有匹配,输出行号、匹配字符串。匹配时不区分大小写,并且可以有一个用中括号表示的模式匹配。如“aa[123]bb”,就是说aa1bb、aa2bb、aa3bb都算匹配。
输入:
输入有多组数据。
每组数据第一行输入n(1<=n<=1000),从第二行开始输入n个字符串(不含空格),接下来输入一个匹配字符串。
输出:
输出匹配到的字符串的行号和该字符串(匹配时不区分大小写)。
样例输入:
4
Aab
a2B
ab
ABB
a[a2b]b
样例输出:
1 Aab
2 a2B
4 ABB
#include <string>
#include <iostream>
using namespace std;
string s[1002], S[1002], t, temp;

string upper(string str){
	int i, l=str.length();
	for(i=0; i<l; i++)
		if(str[i]>='a'&&str[i]<='z') str[i] += ('A'-'a');
		
	//cout << str << endl;//
	return str;
}

int main()
{
	int i, j, l, k, m, n;
	int start, end;
	freopen("1165.txt","r",stdin);//
	
	while( cin >> n ){
		for( i=1; i<=n; i++ ){
			cin >> s[i];
			S[i] = upper(s[i]);
		}
		cin >> t;
		t = upper(t);
		start = t.find("[");
		//cout << "start = " << start << endl;
		
		if( start == -1 ){
			for( i=1; i<=n; i++ ) if( S[i]==t ) cout << i << ' ' << s[i] << endl;
		}
		else{
			end = t.find(']');
			//cout << "end = " << end << endl;
			l = end - start;
			
			string *tt = new string[l];
			for(i=start+1, j=1; i<end; i++, j++){
				tt[j] = t;
				temp = t[i];
				tt[j].replace(start,l+1,temp);
				//cout << "tt["<<j<<"] = " << tt[j] << endl;
			}
			for( i=1; i<=n; i++ ) 
				for( j=1; j<l; j++ )
					if( S[i]==tt[j] ){ cout << i << ' ' << s[i] << endl; break; }
		}
	}
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值