北航2008年机试

1.输入一个整数,要求输出所有从1到这个整数之间个位为1的素数,如果没有则输出-1(30分)

#include<stdio.h>
#include<stdlib.h>
 
int main()
{
    int max;
    int len,i,j;
    int flag;
    while(scanf("%d",&max)!=EOF)
    {
        flag=0;
        len=0;
        max%2==0?len=max/2:len=(max+1)/2;
        int *a=NULL;
        a=(int*)malloc(len*sizeof(int));
        for(i=0,j=3;i<len-1;i++,j+=2)
        {
            a[i]=j;
        }
        for(i=0;i<len-1;i++)
        {
            if(a[i]!=0)
            {
                for(j=a[i];a[i]*j<=max;j+=2)//for是先判断还是先do
                {
                    int m=a[i]*j;
                    int k=(m-1)/2;
                    if(k<len)
                    {
                    a[k-1]=0;
                    }
                }
            }
            if(a[i]%10==1){ printf("%d\n",a[i]);flag=1;}
        }
        if(flag==0) printf("-1\n");
        free(a);
    }
    return 0;
}

思路: 
1. 这里用的是经典筛法求素数,直接百度就知道原理,在最一般化的筛法求素数中,从1开始一直到我们所给的范围,很多数比如,6,15会被删除两次,那么多删除一次就会增加时间复杂度 
2. 改进的筛法求素数是只存储范围内的奇数,从奇数3开始,再按本身的奇数倍递增去筛除非素数 
3. 注意边界值

2.旋转矩阵 
任意输入两个9阶以下矩阵,要求判断第二个是否是第一个的旋转矩阵,如果是,输出旋转角度(0、90、180、270),如果不是,输出-1。 
要求先输入矩阵阶数,然后输入两个矩阵,每行两个数之间可以用任意个空格分隔。行之间用回车分隔,两个矩阵间用任意的回车分隔。(60分) 
我一直觉得这句话有含义…… 
思路:旋转一次则是 
旋转90°:a[i][j]=a[j][n-1-i]; 
旋转180°: a[i][j]=a[n-i-1][n-j-1]; 

旋转270°: a[i][j]=a[n-j-1][i];
 

#include <stdio.h>
 
#define MAX_SIZE 9
 
int main()
{
    int n;
    int i,j;
    int flag=0;
    int f[4]={0,0,0,0};
    int a[MAX_SIZE][MAX_SIZE],b[MAX_SIZE][MAX_SIZE];
    scanf("%d",&n);
    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]);
        }
    }
    for(i=0;i<n;i++)
        {
            for(j=0;j<n;j++)
            {
                if(a[i][j]==b[i][j])
                    f[0]++;
                if(a[i][j]==b[j][n-i-1])
                    f[1]++;
                if(a[i][j]==b[n-i-1][n-j-1])
                    f[2]++;
                if(a[i][j]==b[n-j-1][i])
                    f[3]++;
            }
        }
        for(i=0;i<4;i++)
        {
            if(f[i]==n*n)
            {
                printf("%d\n",i*90);
                flag++;
                break;
            }
        }
        if(flag==0)
            printf("-1\n");
	return 0;
}
/*
1 2 3
4 5 6
7 8 9
90'
7 4 1
8 5 2
9 6 3
a[i][j]=b[j][n-1-i]
180'
9 8 7
6 5 4
3 2 1
  2 2 0 0
  2 1 0 1
  2 0 0 2
  1 2 1 0
  1 1 1 1
  1 0 1 2
a[i][j]=b[n-i-1][n-1-j]
270'
3 6 9
2 5 8
1 4 7
  0 0 2 0
  0 1 1 0
  0 2 0 0
  1 0 2 1
a[i][j]=b[n-1-j][i]
*/

3.题目描述: 
读入数据string[ ],然后读入一个短字符串。要求查找string[ ]中和短字符串的所有匹配,输出行号、匹配字符串。匹配时不区分大小写,并且可以有一个用中括号表示的模式匹配。如“aa[123]bb”,就是说aa1bb、aa2bb、aa3bb都算匹配。 
输入: 
输入有多组数据。 
每组数据第一行输入n(1<=n<=1000),从第二行开始输入n个字符串(不含空格),接下来输入一个匹配字符串。 
输出: 
输出匹配到的字符串的行号和该字符串(匹配时不区分大小写)。 
样例输入: 

Aab 
a2B 
ab 
ABB 
a[a2b]b 
样例输出: 
1 Aab 
2 a2B 
4 ABB
 

#include<stdio.h>
#include<ctype.h>
#include<string.h>
char str[1000][1000];
int main(){
    int n,i,j;
	char b[1000];
	scanf("%d",&n);
	for(i=0;i<n;i++)
	   scanf("%s",str[i]);
	scanf("%s",b);
	int len2=strlen(b),left,right;
    for(i=0;i<len2;i++){
		if(b[i]=='[')left=i;
		if(b[i]==']'){right=i;break;}
	}
	
	bool f1=1,f2=0,f3=1;
	char tmp;int k;
	for(i=0;i<n;i++){
		if(strlen(str[i])!=len2-(right-left+1)+1)continue;
		for(j=0;j<left;j++){
			if(str[i][j]>='0'&&str[i][j]<='9'){
				if(str[i][j]!=b[j]){f1=0;break;}
			}
			else if(toupper(str[i][j])!=toupper(b[j])){f1=0;break;}
		}
		k=j;
        tmp=str[i][j];//printf("%c\n",tmp);
		for(j=left+1;j<right;j++){
            if(toupper(tmp)==toupper(b[j])||tmp==b[j]){f2=1;k++;break;}
		}
		//printf("%d\n",f2);
		for(j=right+1;j<len2;j++,k++){
		//	printf("%c\n",str[i][k]);printf("%c\n",b[j]);
			if(str[i][k]>='0'&&str[i][k]<='9'){
				if(str[i][k]!=b[j]){f3=0;break;}
			}
            else if(toupper(str[i][k])!=toupper(b[j])){f3=0;break;}
		}
		//printf("%d %d %d\n",f1,f2,f3);
		if(f1&&f2&&f3){printf("%d %s\n",i+1,str[i]);f1=1,f2=0,f3=1;}
	}
	return 0; 
}

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值