排序和检索
6174问题
再来一次整理sscanf和sprintf
1 #include <stdio.h> 2 #include<string.h> 3 4 int get_next(int x){ 5 int a,b,n; 6 char s[10]; 7 sprintf(s,"%d",x); 8 n=strlen(s); 9 for(int i=0;i<n;i++){ 10 for(int j=i+1;j<n;j++){ 11 if(s[i]>s[j]){//大的放后面,从小到大 12 char t=s[i];s[i]=s[j];s[j]=t; 13 } 14 } 15 } 16 sscanf(s,"%d",&b); 17 //字符反转 18 for(int i=0;i<n/2;i++){ 19 char t=s[i];s[i]=s[n-i-1];s[n-i-1]=t; 20 } 21 sscanf(s,"%d",&a); 22 return a-b; 23 } 24 25 int num[2000],count; 26 int main() { 27 scanf("%d",&num[0]); 28 printf("%d",num[0]); 29 count=1; 30 for(;;){ 31 //生成并输出下一个数 32 num[count]=get_next(num[count-1]); 33 printf(" -> %d",num[count]); 34 //在数组num中寻找新生成的数 35 int found=0; 36 for(int i=0;i<count;i++){ 37 if(num[i]==num[count]){found=1;break;} 38 } 39 //如果找到,则退出循环 40 if(found) break; 41 count++; 42 } 43 printf("\n"); 44 return 0; 45 }
输入:
1234
输出:
1234 -> 3087 -> 8352 -> 6174 -> 6174
使用qsort和sort的区别:
- qsort的用法:
1 char word[100]; 2 int cmp( const void *a , const void *b ) 3 { 4 return *(char *)a - *(int *)b; 5 } 6 qsort(word,100,sizeof(word[0]),cmp);
- sort的用法:
1 #include<iostream> 2 #include<algorithm> 3 using namespace std;
5 int main(){ 6 int a[20]; 7 for(int i=0;i<20;++i) 8 cin>>a[i]; 9 sort(a,a+20); //范围,很明显这里是a+20 注意,这是必要的,如果是a+19 10 for(i=0;i<20;i++) //最后一个值a[19]就不会参与排序。 11 cout<<a[i]<<endl; 12 return 0; 13 }
默认的sort为升序,可改为降序:
1 bool compare(int a,int b) 2 { 3 return a>b; //降序排列,如果改为return a<b,则为升序 4 } 5 sort(*a,*b,cmp);
字母重排
要疯了这题,居然是最后面输出word[j],写成了word[i],搞了半天 → → |||
看前面,qsort的用法很重要!
1 #include <stdio.h> 2 #include<string.h> 3 #include<stdlib.h> 4 int n; 5 char word[2000][10],sorted[2000][10]; 6 //字符比较函数 7 int cmp_char(const void* _a,const void* _b){ 8 char* a=(char*)_a; 9 char* b=(char*)_b; 10 return *a-*b; 11 } 12 //字符串比较函数 13 int cmp_string(const void* _a,const void* _b){ 14 char* a=(char*)_a; 15 char* b=(char*)_b; 16 return strcmp(a,b); 17 } 18 int main(){ 19 n=0; 20 int i,j; 21 for(;;){ 22 scanf("%s",word[n]); 23 if(word[n][0]=='*') break; 24 n++; 25 } 26 qsort(word,n,sizeof(word[0]),cmp_string); 27 // for(i=0;i<n;i++)printf("%s ",word[i]); 28 // printf("\n"); 29 //给所有单词排序,保证按序输出 30 // printf("%d",n); 31 for(i=0;i<n;i++){ 32 strcpy(sorted[i],word[i]); 33 qsort(sorted[i],strlen(sorted[i]),sizeof(char),cmp_char); 34 // printf("%s ",sorted[i]); 35 // printf("\n"); 36 //给每个单词排序 37 } 38 // for(i=0;i<n;i++)printf("%s ",sorted[i]); 39 // printf("\n"); 40 char s[10]; 41 while(scanf("%s",s)!=EOF){ 42 qsort(s,strlen(s),sizeof(char),cmp_char); 43 // printf("%s",s); 44 // printf("\n"); 45 int found=0; 46 for(j=0;j<n;j++){ 47 if(strcmp(sorted[j],s)==0){ 48 found=1; 49 printf("%s ",word[j]);//输出原始单词!!!!就是这个写错了! 50 } 51 } 52 if(!found) printf(":("); 53 printf("\n"); 54 } 55 // for(i=0;i<n;i++){ 56 // printf("%s ",word[i]);} 57 return 0; 58 }
输入:
tarp given score refund only trap work earn course pepper part
*
resco nfudre aptr sett oresuc
输出:
score
refund
part tarp trap
:(
course