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;}程序截圖:
新聞熱點
疑難解答