做题笔记(续)

还是三道题。粗略地测试了一下,貌似没有大问题。
贴上来。
2008年的复试上机题目
1.素数
输入一个整数,要求输出所有从1到这个整数之间个位为1的素数,如果没有则输出-1(30分)(水题吗)

#include <stdio.h>
#include <math.h>
 
bool judge(int n)
{
	bool flag=true;
	for(int i=2;i<=sqrt(n);i++)
	{
		if(n%i==0)
		{
			flag=false;
			break;
		}
	}
	return flag;
}
 
void main()
{
	int n;
	scanf("%d",&n);
	if(n<=11)
	{
		printf("%d",-1);
	}
	else
	{
		for(int i=11;i<n;i=i+10)
		{
			if(judge(i))
			{
				printf("%d ",i);
			}
		}
	}
}

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

#include <stdio.h>
 
void printMatrix(int** a,int n)
{
	for(int i=0;i<n;i++)
	{
		for(int j=0;j<n;j++)
		{
			printf("%d ",a[i][j]);
		}
		printf("%s","\n");
	}
}
 
void initMatrix(int** a,int n)
{
	for(int i=0;i<n;i++)
	{
		a[i]=new int [n];
		for(int j=0;j<n;j++)
		{
			scanf("%d",&a[i][j]);
		}
	}
}
 
bool zero(int** a,int** b,int n)
{	
	for(int i=0;i<n;i++)
	{
		for(int j=0;j<n;j++)
		{
			if(a[i][j]==b[i][j])
				continue;
			else			
				return false;			
		}
	}
	return true;
}
 
bool ninety(int** a,int** b,int n)
{	
	for(int i=0;i<n;i++)
	{
		for(int j=0;j<n;j++)
		{
			if(a[i][j]==b[j][n-1-i])
				continue;
			else			
				return false;			
		}
	}
	return true;
}
 
bool reverse(int** a,int** b,int n)
{	
	for(int i=0;i<n;i++)
	{
		for(int j=0;j<n;j++)
		{
			if(a[i][j]==b[n-1-i][n-1-j])
				continue;
			else			
				return false;			
		}
	}
	return true;
}
 
bool counterninety(int** a,int** b,int n)
{	
	for(int i=0;i<n;i++)
	{
		for(int j=0;j<n;j++)
		{
			if(a[i][j]==b[n-1-j][i])
				continue;
			else			
				return false;			
		}
	}
	return true;
}
 
void main()
{
	int m=0,n=0;
	scanf("%d",&n);
	scanf("%d",&m);	
	int** m1=new int* [n];
	int** m2=new int* [m];
	initMatrix(m1,n);
	initMatrix(m2,m);
 
	if(m!=n)
	{
		printf("%d",-1);		
	}
	else if(zero(m1,m2,n))
	{
		printf("%d",0);
	}
	else if(ninety(m1,m2,n))
	{
		printf("%d",90);
	}
	else if(reverse(m1,m2,n))
	{
		printf("%d",180);
	}
	else if(counterninety(m1,m2,n))
	{
		printf("%d",270);
	}
	else
	{
		printf("%d",-1);
	}
}

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

#include <stdio.h>
#include <string.h>
#include <ctype.h> 
//认为[]只能匹配一个字符
char getNewStarter(char *t,int j)
{
	while(t[j]!=']')
		j++;
	return t[j+1];
}
 
bool find(char *s,char *t,int start,int& end)
{	
	int i=start,j=0;
	end=start;
	while(t[j]&&s[i])
	{
		if(tolower(s[i])==tolower(t[j]))
		{
			i++;
			j++;				
		}		
		else if(t[j]=='[')
		{
			if(tolower(s[i])==tolower(getNewStarter(t,j)))//fanjunishere fan[89]jun和[89]fanjun
			{
				while(t[j]!=']')
					j++;
				i++;
				j=j+2;
			}
			else if(getNewStarter(t,j)=='\0')//fanjunishere fanjun[89]
			{
				end=i;
				return true;
			}
			else{//普通情况
				bool flag=false;
				do
				{
					j++;
					if(tolower(t[j])==tolower(s[i]))
					{
						flag=true;					
					}
				}while(t[j]!=']');
				if(!flag)
				{
					return false;				
				}
				else
				{
					i++;
					j++;
				}
			}
		}
		else
		{
			return false;
		}
	}
	if(t[j]=='\0'||t[j]=='[')//doyouknowfanjun fanjun[89]
	{
		end=i;
		return true;
	}
	else
	{
		return false;
	}
}
 
void main()
{
	char input[50];
	scanf("%s",input);
	FILE *fp1,*fp2;	
	if ((fp1=fopen("string.in","r"))==NULL)
        { 
                printf("cannot open file\n");
		return;			
        }
	fp2=fopen("string.out","w");
	char buff[50];
	int line=1;
	while(fgets(buff,50,fp1)>0)
	{
		for(unsigned int i=0;i<strlen(buff);i++)
		{
			int end;
			if(find(buff,input,i,end))
			{
				fprintf(fp2,"%d ",line);
				for(int j=i;j<end;j++)
					fprintf(fp2,"%c",buff[j]);
				fprintf(fp2,"%s","\n");
			}
		}
		line++;
	}
}

总结一下,字符串是重点。

8 thoughts on “做题笔记(续)

  1. 考研的复试需不需要对这些题目进行一些算法优化?
    比如第一题可以用筛法求素数之类的?这样会不会得到一些加分?
    小弟明年也要考研,特地求教求教

    • 我感觉评分应该和acm评测那个差不多,就是给出具有一些区分度的测试数据看程序能否通过。优化算法对通过那些“边缘数据”是有帮助的

  2. 其实感觉最后一题可以用字典树来做,速度会快很多,我感觉60分的题目,直接这样暴力跑会不会太简单了?

  3. 只看了第三题,感觉用trie树做比较好。
    先把string.in中的数据生成trie树,然后根据输入进行遍历,效率会高些

    • 我怎么感觉是用输入的串生成trie树,然后用string.in中的数据来遍历这个树呢?

      你是不是认为输入的字符串中没有中括号,而中括号在string.in的数据中?

发表评论

电子邮件地址不会被公开。 必填项已用 * 标注

*

您可以使用这些 HTML 标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>