基础算法选解_排序和检索

排序和检索

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

 

转载于:https://www.cnblogs.com/JanFangZ/p/7272401.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值