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;
}