北航研究生复试机试真题-2008年

2008年北航机试真题

题目来源于网络。

1、素数判断
输入一个整数,要求输出所有从1到这个整数之间的,个位是1的,素数,如果没有则输出-1
(由于这些题目都是各位前辈回忆版,具体输入数据的范围未知)

代码:(根据自己理解写的代码,仅进行了一些简单测试)

#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;

/*
输入一个证整数,要求输出从 1 到这个整数之间
所有个位数字为1的整数。 
*/

// 6素数法 判断素数 步长为6  降低复杂度。
bool judge(int n)
{
	int k=sqrt(n)+1;
	if(n<=3)
		return n>1;
	if(n%2==0 ||n%3==0) return false;
	for(int i=5;i<k;i+=6)
	{
		if(n%i==0 || n%(i+2)==0) return false;
	}
	return true;
} 

int main()
{
	int n,flag=0;
	cin>>n;
	for(int i=2;i<=n;i++)
	{
		if(i%10==1 && judge(i)) 
		{
			flag=1;
			cout<<i<<endl;
		}
	} 
	if(flag==0)
		cout<<"-1"<<endl;
	return 0;
}  

2、旋转矩阵
任意输入两个9阶以下的矩阵,要求判断第二个是否是第一个的旋转矩阵,如果是,输出旋转角度(0,90,180,270),如果不是,输出-1。
先输入矩阵阶数,然后输入两个矩阵,每行两个数之间可以用任意空格分隔,行之间用回车分隔,两个矩阵间用任意的回车分隔。

代码:

旋转90度的操作可以将矩阵沿主对角线翻转,然后再把各列倒序。

#include<iostream>
using namespace std;

/*
旋转矩阵:
任意输入两个9阶以下的矩阵,要求判断第二个是否是第一个的旋转矩阵.
如果是,输出旋转角度(0,90,180,270),如果不是,输出-1
先输入矩阵阶数,然后输入两个矩阵,每行两个数之间可以用任意空格分隔,
行之间用回车分隔,两个矩阵间用任意的回车分隔。
*/

int main()
{
	int n;
	cin>>n;
	int **a=new int *[n];
	int **b=new int *[n];
	for(int i=0;i<n;i++) 
	{
		a[i]=new int[n];
		for(int j=0;j<n;j++)
			cin>>a[i][j];
	}
	int flag=0;
	for(int i=0;i<n;i++) 
	{
		b[i]=new int[n];
		for(int j=0;j<n;j++)
		{
			cin>>b[i][j];
			if(a[i][j] != b[i][j]) flag=1;
		}
	}
	if(flag==0) 
	{
		cout<<"0"<<endl;
		return 0;
	}
	flag=0;
	//把 a 翻转 90 度
	for(int i=0;i<n;i++)
	{
		for(int j=0;j<i;j++) 
		{
			int t=a[i][j];
			a[i][j]=a[j][i];
			a[j][i]=t;
		}
	} 
	for(int i=0;i<n/2;i++)
	{
		for(int j=0;j<n;j++)
		{
			int t=a[j][i];
			a[j][i]=a[j][n-1-i];
			a[j][n-1-i]=t;
		}
	}
	for(int i=0;i<n;i++)
	{
		for(int j=0;j<n;j++) 
		if(a[i][j]!=b[i][j])flag=1;
	}
	if(flag==0) 
	{
		cout<<"90"<<endl;
		return 0;
	}
	flag=0;
	//把 a 翻转 90 + 90 度
	for(int i=0;i<n;i++)
	{
		for(int j=0;j<i;j++) 
		{
			int t=a[i][j];
			a[i][j]=a[j][i];
			a[j][i]=t;
		}
	} 
	for(int i=0;i<n/2;i++)
	{
		for(int j=0;j<n;j++)
		{
			int t=a[j][i];
			a[j][i]=a[j][n-1-i];
			a[j][n-1-i]=t;
		}
	}
	for(int i=0;i<n;i++)
	{
		for(int j=0;j<n;j++) 
		if(a[i][j]!=b[i][j])flag=1;
	}
	if(flag==0) 
	{
		cout<<"180"<<endl;
		return 0;
	}
	flag=0;
	//把 a 翻转 90 + 90 + 90 度
	for(int i=0;i<n;i++)
	{
		for(int j=0;j<i;j++) 
		{
			int t=a[i][j];
			a[i][j]=a[j][i];
			a[j][i]=t;
		}
	} 
	for(int i=0;i<n/2;i++)
	{
		for(int j=0;j<n;j++)
		{
			int t=a[j][i];
			a[j][i]=a[j][n-1-i];
			a[j][n-1-i]=t;
		}
	}
	for(int i=0;i<n;i++)
	{
		for(int j=0;j<n;j++) 
		if(a[i][j]!=b[i][j])flag=1;
	}
	if(flag==0) 
	{
		cout<<"270"<<endl;
		return 0;
	}
	cout<<"-1"<<endl;
	return 0;
} 

3、字符串匹配

从string.in中读入数据,然后用户输入一个短字符串,要求查找string.in中和短字符串的所有匹配,输出行号、匹配字符到string.out文件中,匹配时不区分大小写,并且可以有一个用中括号表示的模式匹配。如"aa[123]bb",就是说aa1bb,aa2bb,aa3bb都算匹配

代码:
从文件读一行进来,然后KMP算法匹配,每匹配到一个就写入输出文件中。

#include<iostream>
#include<fstream>
#include<string>
#include<cstring>
#include<vector>
using namespace std;

ofstream out("out.txt");

int *get_next(string pattern)
{
	int n=pattern.length();
	int i=1,len=0;
	int *next=new int[n+1];
	next[0]=0;
	while(i<n)
	{
		if(pattern[i]==pattern[len])
		{
			len++;
			next[i]=len;
			i++;
		}
		else
		{
			if(len > 0) len=next[len-1];
			else
			{
				next[i]=len;
				i++;
			}
		}
	}
	for(int i=n-1;i>0;i--) next[i]=next[i-1];
	next[0]=-1;
	return next;
}

void kmp_find(char *test,string pattern)
{
	int n=strlen(test);
	int m=pattern.length();
	for(int i=0;i<m;i++)
	{
		if(pattern[i]>='A' && pattern[i]<='Z') pattern[i]+=32;
	}
	char *test2=new char [n+1];
	for(int i=0;i<n;i++)
	{
		if(test[i]>='A' && test[i] <='Z') test2[i]=test[i]+32;
		else test2[i]=test[i];
	}
	int i=0,j=0;
	int *next=get_next(pattern);
	while(i<n)
	{
		if(j==m-1 && pattern[j]==test2[i])
		{
			int t=0;
			for(int k=i-m+1;k<=i;k++) out<<test[k]; 
			out<<" ";
			j=next[j];
		}
		if(pattern[j]==test2[i])
			i++,j++;
		else
		{
			j=next[j];
			if(j==-1) j++,i++;
		}
	}
}

int main()
{
	string s;
	cin>>s;
	vector<string> vec;
	int start=-1,end=-1;
	for(int i=0;i<s.length();i++)
	{
		if(s[i]=='[') start=i;
		if(s[i]==']') end=i;
	}
	if(start==-1)
		vec.push_back(s);
	else
	{
		for(int i=0;i<end-start-1;i++)
		{
			char tmp[20];
			for(int j=0;j<start;j++) tmp[j]=s[j];
			tmp[start]=s[start+i+1];
			for(int k=end+1;k<=s.length();k++)
				tmp[start+k-end] = s[k];
			string tt(tmp);
			vec.push_back(tt);
		}
	}
	char *test=new char [200]; 
	ifstream in("in.txt");
	char ch;
	int cnt=0;
	int line = 0;
	while(in.get(ch))
	{
		if(ch!='\n') 
			test[cnt++]=ch;
		else 
		{
			test[cnt]='\0';
			out<<line<<" ";
			for(int i=0;i<vec.size();i++)
			{
				kmp_find(test,vec[i]);
			}
			out<<endl;
			line++;
			cnt=0;
		}
	}
	if(cnt!=0)
	{
		test[cnt]='\0';
		out<<line<<" ";
		for(int i=0;i<vec.size();i++)
		{
			kmp_find(test,vec[i]);
		}
		out<<endl;
	}
	in.close();
	out.close();
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值