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 10void 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 101struct 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;}程序截图:
新闻热点
疑难解答