题意:给出一些单词,以#结束,判断这些单词是否是ananagram。如果是按字典序输出。
思路:每个大写字母变成小写,把单词中的字母按字典序排,再把单词按字典序排序,然后判断。最后输出没有改变的单词。
1 #include<stdio.h> 2 #include<string.h> 3 #include<stdlib.h> 4 5 typedef struct 6 { 7 char s1[90]; //存放最初的单词。 8 char s2[90]; //存放小写排序后的单词。 9 int flag; //标记是否ananagram。 10 }word; 11 12 int cmp1(const void *a, const void *b) //字母排序 13 { 14 return *(char *)a-*(char *)b; 15 } 16 17 int cmp2(const void *a, const void *b) //原单词排序 18 { 19 word *pa = (word *)a; 20 word *pb = (word *)b; 21 return strcmp(pa->s1, pb->s1); 22 } 23 24 int cmp3(const void *a, const void *b) //改过的单词排序 25 { 26 word *pa = (word *)a; 27 word *pb = (word *)b; 28 return strcmp(pa->s2, pb->s2); 29 } 30 31 int main() 32 { 33 int i, j; 34 word w[1010]; 35 i=0; 36 memset(w[i].s1, 0, sizeof(w[i].s1)); 37 memset(w[i].s2, 0, sizeof(w[i].s2)); 38 w[i].flag=0; //0是ananagram 39 scanf("%s%*c", w[i].s1); 40 while(strcmp(w[i].s1, "#")) 41 { 42 for (j=0; j<strlen(w[i].s1); j++) 43 { 44 if (w[i].s1[j]>='A' && w[i].s1[j]<='Z') 45 { 46 w[i].s2[j]=w[i].s1[j]+32; //大写变小写 47 continue; 48 } 49 w[i].s2[j]=w[i].s1[j]; 50 } 51 i++; 52 memset(w[i].s1, 0, sizeof(w[i].s1)); 53 memset(w[i].s2, 0, sizeof(w[i].s2)); 54 w[i].flag=0; 55 scanf("%s%*c", w[i].s1); 56 } 57 for (j=0; j<i; j++) //字母排序 58 { 59 qsort(w[j].s2, strlen(w[j].s2), sizeof(char), cmp1); 60 } 61 qsort(w, i, sizeof(word), cmp3); //单词排序 62 for (j=0; j<i; j++) 63 { 64 if (strlen(w[j].s2)>1) //单个字母是ananagram 65 { 66 if (strcmp(w[j].s2, w[j+1].s2) == 0) 67 { 68 w[j].flag++; 69 w[j+1].flag++; 70 } 71 } 72 } 73 qsort(w, i, sizeof(word), cmp2); //单词排序 74 for (j=0; j<i; j++) 75 { 76 if (w[j].flag==0) 77 puts(w[j].s1); 78 } 79 return 0; 80 }