Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1411691
  • 博文数量: 241
  • 博客积分: 10
  • 博客等级: 民兵
  • 技术积分: 2253
  • 用 户 组: 普通用户
  • 注册时间: 2012-04-11 22:27
个人简介

--

文章分类

全部博文(241)

文章存档

2021年(3)

2019年(6)

2018年(1)

2017年(9)

2016年(21)

2015年(50)

2014年(125)

2013年(26)

我的朋友

分类: C/C++

2014-03-05 19:37:00

题目:
// 功能:将输入的数组排成最小的数
// 输入: int a[]:整型数组
//        int nCount:数组长度
//        char * strRst 返回值
// 输出:
// 返回:成功返回0  异常返回-1
例如:32,321 组合出最小数字为32132,以此类推

代码:

点击(此处)折叠或打开

  1. #include <stdlib.h>
  2. #include <string.h>
  3. #include "oj.h"
  4. // 功能:将输入的数组排成最小的数
  5. // 输入: int a[]:整型数组
  6. // int nCount:数组长度
  7. // char * strRst 返回值
  8. // 输出:
  9. // 返回:成功返回0 异常返回-1
  10. #define M 100
  11. #define N 10
  12. void data2str(int data, char* str)
  13. {

  14.     while (data != 0)
  15.     {
  16.         *str = '0' + data%10;
  17.         str++;
  18.         data = data/10;
  19.     }
  20.     *str = '\0';
  21. }

  22. void reverse(char * str)
  23. {
  24.     if (NULL == str)
  25.     {
  26.         return;
  27.     }
  28.     int len = strlen(str);
  29.     int front = 0;
  30.     int end = len - 1;
  31.     char tmp;
  32.     while (front < end)
  33.     {
  34.         tmp = str[front];
  35.         str[front] = str[end];
  36.         str[end] = tmp;

  37.         front++;
  38.         end--;
  39.     }
  40.     return;
  41. }
  42. int smallestDigit(int a[],int nCount,char * strRst)
  43. {
  44.     if (a==NULL || nCount<=0 || NULL==strRst)
  45.     {
  46.         return -1;
  47.     }
  48.     char data_str[M][N];
  49.     memset(data_str,'\0',sizeof(data_str));
  50.     int i,j;
  51.     char tmp[N] = {0};
  52.     for(i=0; i<nCount; i++)
  53.     {
  54.         memset(tmp,'\0',sizeof(tmp));
  55.         data2str(a[i], tmp);
  56.         reverse(tmp);
  57.         strncpy(data_str[i],tmp,strlen(tmp));

  58.     }
  59.     //冒泡排序
  60.     int len_1 = 0;
  61.     int len_2 = 0;
  62.     int min = 0;
  63.     char next;
  64.     int z;
  65.     for (i=0; i<nCount; i++)
  66.     {
  67.         for(j=i+1;j<nCount; j++)
  68.         {
  69.             len_1 = strlen(data_str[i]);
  70.             len_2 = strlen(data_str[j]);
  71.             min = len_1 < len_2 ? len_1 : len_2;
  72.             if (len_1 == len_2)
  73.             {
  74.                 if (strncmp(data_str[i],data_str[j],min) > 0)
  75.                 {
  76.                     memset(tmp,'\0',sizeof(tmp));
  77.                     strncpy(tmp,data_str[i],len_1);
  78.                     strncpy(data_str[i],data_str[j],len_2);
  79.                     strncpy(data_str[j],tmp,len_1);
  80.                 }
  81.             }
  82.             else
  83.             {
  84.                 if (strncmp(data_str[i],data_str[j],min) == 0)
  85.                 {
  86.                     if (len_1 > len_2)
  87.                     {
  88.                         next = data_str[i][min];
  89.                         if (next >= data_str[i][0])
  90.                         {
  91.                             memset(tmp,'\0',sizeof(tmp));
  92.                             strncpy(tmp,data_str[i],len_1);
  93.                             memset(data_str[i],'\0',strlen(data_str[i]));
  94.                             strncpy(data_str[i],data_str[j],len_2);
  95.                             strncpy(data_str[j],tmp,len_1);                        
  96.                         }
  97.                     }
  98.                     else
  99.                     {
  100.                         next = data_str[j][min];
  101.                         if (next < data_str[i][0])
  102.                         {
  103.                             memset(tmp,'\0',sizeof(tmp));
  104.                             strncpy(tmp,data_str[j],strlen(data_str[j]));
  105.                             memset(data_str[j],'\0',strlen(data_str[j]));
  106.                             strncpy(data_str[j],data_str[i],strlen(data_str[i]));
  107.                             strncpy(data_str[i],tmp,strlen(tmp));    

  108.                         }
  109.                     }
  110.                 }
  111.                 else
  112.                 {
  113.                     if (strncmp(data_str[i],data_str[j],min) > 0)
  114.                     {
  115.                         memset(tmp,'\0',sizeof(tmp));
  116.                         strncpy(tmp,data_str[i],len_1);
  117.                         strncpy(data_str[i],data_str[j],len_2);
  118.                         strncpy(data_str[j],tmp,len_1);
  119.                     }
  120.                 }
  121.             }
  122.         }
  123.     }
  124.     //拼接起来
  125.     int len = 0;

  126.     for (i=0; i<nCount; i++)
  127.     {
  128.         memcpy(strRst+len,data_str[i],strlen(data_str[i]));
  129.         len += strlen(data_str[i]);
  130.     }
  131.     strRst[len] = '\0';
  132.     return 0;
  133. }
注:字符串相互替换、拷贝时注意长短造成的覆盖,末尾需要以'\0'结束或是拷贝之前置空,否则造成无法正确拷贝。
例如:原来为'321',用'32'覆盖就会造成没覆盖成的现象。我傻缺这个错误找了半天
阅读(494) | 评论(0) | 转发(0) |
0

上一篇:树的深度、宽度计算

下一篇:递归详解

给主人留下些什么吧!~~