1. 素数
’
源代码:
#include <stdio.h>
#include <math.h>
void FindPrimenum(int n)
{
int i,j,k;
int num=0,flag;
for(i=2;i<n;i++)
{
k=sqrt(i),flag=1;
for(j=2;j<=k;j++)
{
if(i%j==0 && i!=2) //2是素数,把这一特殊情况去掉
{
flag=0;
break;
}
}
if(flag==1 && i%10==1)
{
num++;
if(num==1)
printf("%d",i);
else
printf(" %d",i);
}
}
if(num==0)
printf("-1");
printf("\n");
}
int main()
{
int n;
while(scanf("%d",&n)!=EOF)
FindPrimenum(n);
return 0;
}
程序截图:
2. 旋转矩阵
源代码:
#include <stdio.h>
#define maxn 10
void Judge(int a[][maxn],int b[][maxn],int n) //判断角度0.90.180.270(旋转角度为多个时的最小角度)或非旋转矩阵
{
int i,j,angle;
int flag1=1,flag2=1,flag3=1,flag4=1;
for(i=0;i<n;i++) //注意元素间的对应关系,可以取较小的n推出
{
for(j=0;j<n;j++)
{
if(a[i][j]!=b[i][j])
{
flag1=0;
break;
}
}
}
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
if(a[i][j]!=b[n-1-i][n-1-j])
{
flag2=0;
break;
}
}
}
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
if(a[i][j]!=b[j][n-1-i])
{
flag3=0;
break;
}
}
}
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
if(a[i][j]!=b[n-1-j][i])
{
flag4=0;
break;
}
}
}
if(flag1==1)
angle=0;
else if(flag2==1)
angle=180;
else if(flag3==1)
angle=90;
else if(flag4==1)
angle=270;
else
angle=-1;
printf("%d\n",angle);
}
int main()
{
int i,j,n;
int a[maxn][maxn],b[maxn][maxn];
while(scanf("%d",&n)!=EOF)
{
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]);
Judge(a,b,n);
}
return 0;
}
程序截图:
3. 字符串匹配
源代码:(天真地以为会与KMP有点关系,然而还是想多了:( 附上一个参考代码及我的理解吧。不得不说这个题很好很有新意,值得继续深入思考)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX 1001
#define LEN 101
struct string //定义结构体为字符串类型
{
char name[101];
};
int main()
{
struct string strs[MAX]; //数据字符串
struct string t[LEN]; //文本数组
int i,j,k,n;
int len,left,right,count,flag;
char text[LEN],newtext[LEN]; //text[LEN]保存短字符串 newtext[LEN]保存文本串字符
while(scanf("%d",&n)!=EOF)
{
getchar(); //接收数据
for(i=0;i<n;i++)
scanf("%s",strs[i].name);
getchar(); //接收文本串
gets(text);
len=strlen(text);
for (i=left=right=0;i<len;i++)
{
if(text[i]=='[') //left记录模式匹配起始点
left=i;
else if(text[i]==']') //right记录模式匹配终止点
{
right=i;
break;
}
}
count=right-left-1; //count记录模式匹配区间长度
if(count<=0) //不需要(正则)匹配,直接看文本串除'['和']'外的其它字符
{
for(i=j=0;i<len;i++)
{
if(text[i]!='[' && text[i]!=']') //保存文本串字符
newtext[j++]=text[i];
}
newtext[j] = '\0';
for (i=0;i<n;i++)
{
if (strcasecmp(strs[i].name,newtext) == 0) //忽略字母大小写,判断字符串是否相同,相同则输出数据字符串string[]
printf("%d %s\n",i+1,strs[i].name);
}
}
else //需要(正则)匹配
{
for(j=1,k=0;j<=count;j++,k++) //构建文本数组
{
memset(t[k].name,'\0',sizeof(t[k].name)); //文本数组初始化
for(i=0;i<left;i++) //文本串left前面的字符赋给文本数组
t[k].name[i]=text[i];
t[k].name[i]=text[left+j]; //从模式匹配中取一个字符,赋给文本数组
strcat(t[k].name,text+right+1); //文本串right后面的字符赋给文本数组
}
for(i=0;i<n;i++) //(正则)匹配
{
for(j=flag=0;j<count;j++)
{
if(strcasecmp(strs[i].name,t[j].name)==0) //只要匹配成功,flag=1,后续不再匹配,将数据字符串输出
{
flag=1;
break;
}
}
if(flag)
printf("%d %s\n",i+1,strs[i].name);
}
}
}
return 0;
}
程序截图: