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个字符串(不含空格),接下来输入一个匹配字符串。
输出:
输出匹配到的字符串的行号和该字符串(匹配时不区分大小写)。
样例输入:
4
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;
}