字符串数字从小到大输出

华为面试时,面试官出的一道题,将一个随机的整数转换成一个按各位上数值大小排序的整数,例如整数2541转换成1245,随机整数521368转换成123568,用C语言编程来实现,要求不能使用一步到位的库函数.

  1. #include <stdio.h>  
  2. void func(char *str)  
  3. {  
  4.     if(NULL == str)  
  5.         return ;  
  6.     unsigned int s[10] = {0};  
  7.     const char *p = str;  
  8.     while('\0' != *p)  
  9.     {  
  10.         ++ s[*p++ - '0'];  
  11.     }  
  12.     unsigned int i ,j, nCount = 0;  
  13.     for(i = 0; i < 10; ++ i)  
  14.     {  
  15.         for(j = 0; j < s[i]; ++ j)  
  16.         {  
  17.             str[ nCount++ ] = i + '0';  
  18.         }         
  19.     }  
  20.     str[nCount] = '\0';   
  21. }  
  22. void main()  
  23. {  
  24.     //无论多大的数据都当作字符串处理  
  25.     char str[] = "999888877773333111100001423412412341234123412412342";  
  26.     func(str);  
  27.     printf("%s\n",str);  
  28. }  

有一段类似这样的字符串:"7C7C307C724C7C267C7C7C7C7C3A7C417C7C7" 其中每两位两位的代表一个字符,类似:“7C”对应“|”、“24”对应“$”、“41”对应“A”、“26”对应“&”等等。。。想用纯C写这样一个函数,

  1. #include <stdio.h>  
  2. #include <string.h>  
  3. #include <math.h>  
  4.   
  5. char FromStrToChar(char *str)  
  6. {  
  7.     if(NULL == str || strlen(str) != 2)  
  8.         return '\0';  
  9.   
  10.     //对应十六进制数据  
  11.     int a[] = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};  
  12.   
  13.     unsigned int i,sum = 0;  
  14.   
  15.     for(i = 0; i < 2; ++ i)  
  16.     {  
  17.         if(str[i] >= '0' && str[i] <= '9')  
  18.         {  
  19.             sum += a[str[i] - '0'] * (16/pow(16,i));  
  20.         }  
  21.         else  
  22.         {  
  23.             sum += a[str[i] - 'A' + 10] * (16/pow(16,i));  
  24.         }  
  25.     }  
  26.           
  27.     return (char)sum;  
  28.   
  29. }  
  30.   
  31. void StringConvert(char *str)  
  32. {  
  33.     unsigned int len = strlen(str);  
  34.     if(len & 1)  
  35.     {  
  36.         //字符串数目为奇数,编码有问题,自动清空  
  37.         //你可以根据自己情况处理  
  38.         *str = '\0';  
  39.         return ;  
  40.     }  
  41.   
  42.     unsigned int i, nCount = 0;  
  43.     char a[3] = {0};  
  44.   
  45.     for(i = 0; i < len / 2; ++ i)  
  46.     {          
  47.         a[0] = str[i*2];//第一位  
  48.         a[1] = str[i*2 + 1];//第二位  
  49.         a[2] = '\0';  
  50.   
  51.         str[nCount ++] = FromStrToChar(a);  
  52.     }  
  53.     str[nCount] = '\0';  
  54. }  
  55.   
  56. void main()  
  57. {  
  58.     char str[] = "7C7C307C724C7C267C7C7C7C7C3A7C417C7C";  
  59.   
  60.     StringConvert(str);  
  61.   
  62.     printf("%s\n",str);  
  63.   
  64. }
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值