看流星社区

 找回密码
 注册账号
查看: 1630|回复: 0

[算法练习]实现itoa,atoi

[复制链接]

该用户从未签到

发表于 2017-6-1 13:33:50 | 显示全部楼层 |阅读模式
  1. int my_itoa(int val, char* buf)
  2. {
  3.     char *p2;
  4.     unsigned int a;        //every digit
  5.     int len;
  6.     char *p1;            //start of the digit char
  7.     char temp;
  8.     unsigned int u;
  9.     if(buf==NULL)
  10.     {
  11.          return 0;
  12.     }
  13.     p2 = buf;
  14.     if (val < 0)
  15.     {
  16. if(val == 0x80000000)
  17. {
  18.     char *num = "-2147483648";
  19.     for(i=0;i<12;i++)
  20.     {
  21. buf[i] = *num++;
  22.                }
  23.     return 11;
  24. }
  25.         *p2++ = '-';
  26.         val = 0 - val;
  27.     }
  28.     u = (unsigned int)val;
  29.     p1 = p2;
  30.     do
  31.     {
  32.         a = u % 10;
  33.         u /= 10;
  34.         *p2++ = a + '0';
  35.     } while (u > 0);
  36.     len = (int)(p2 - buf);
  37.     *p2-- = 0;
  38.     //swap
  39.     do
  40.     {
  41.         temp = *p2;
  42.         *p2 = *p1;
  43.         *p1 = temp;
  44.         --p2;
  45.         ++p1;
  46.     } while (p1 < p2);
  47.     return len;
  48. }
复制代码

  1. #define MAX ((int)0x7FFFFFFF)//整数最大32位都是1
  2. #define MIN ((int)0x80000000)//最大+1就是最小
  3. int my_atoi(const char * str)
  4. {
  5.      bool negative=false;
  6.      unsigned long result=0;
  7.      if(str==NULL)
  8.          return 0;
  9.      while(*str==' ')
  10.          str++;
  11.      if(*str=='-')
  12.      {
  13.          negative=true;
  14.          str++;
  15.      }
  16.      else if(*str=='+')
  17.          str++;
  18.      if(*str<'0'||*str>'9')
  19.          return 0;
  20.      while(*str>='0' && *str<='9')
  21.      {
  22.          result=result*10+*str-'0';
  23. //小于最小值 ||大于最大值
  24.          if((negative && result>MAX + 1) || (!negative &&  result>MAX))
  25.          {
  26.              //溢出检测
  27.              return 0;
  28.          }
  29.          str++;
  30.      }
  31.      //负数处理
  32.      if(negative)
  33.          result *= -1;
  34.      return (int)result;
  35. }
复制代码
我自己实现的:
  1. int aatoi(const char * str)
  2. {
  3.         if(!str)return 0;
  4.         __int64 test=+0;
  5.         char sign=0 ;
  6.         if( ( str[0]=='-' ?--sign:( str[0]=='+'?++sign:sign++ ) ) )
  7.         str++;
  8.         while('0'<= *str && *str <= '9')
  9.         {
  10.         test = test*10 + (*str++ - '0');
  11.         if(test*sign> 2147483646) return 2147483647;       
  12.         else if(test*sign< -2147483647) return -2147483648;
  13.         }
  14.         return int(test)*sign;
  15. }
复制代码
  1. #define INT_MAX (2147483647)
  2. #define INT_MIN (-2147483648)
  3. int _atoi(const char *str)
  4. {
  5.         if(NULL == str) return 0;
  6.         unsigned int result = 0;
  7.         int sign = 1;
  8.         if(*str == '-' || *str == '+')
  9.         {
  10.                 if(*str == '-')
  11.                         sign = -1;
  12.                 str++;
  13.         }
  14.         while ('0' <= *str && *str <= '9')
  15.         {
  16.                 unsigned int digit = *str - '0';
  17.                 if((result >INT_MAX / 10) ||
  18.                         (sign > 0 ? (result == INT_MAX / 10 && digit > INT_MAX %10)
  19.                         :(result == ((unsigned int)INT_MAX + 1) / 10 && digit > (((unsigned int)(INT_MAX + 1) % 10)))))
  20.                 {
  21.                         return sign > 0 ? INT_MAX : INT_MIN;
  22.                 }
  23.                 result = result * 10 + digit;
  24.                 str++;
  25.         }
  26.         return ((int)result) * sign;
  27. }
复制代码
  1. char* _iota(int num)
  2. {
  3.         static char str[MAX_PATH] = {0};
  4.         int isNeg = num;
  5.         if(isNeg<0)
  6.                 num = -num;
  7.         int i = 0;
  8.         do
  9.         {
  10.                 str[i++] = num % 10 + '0';
  11.                 num = num / 10;
  12.         } while (num>0);
  13.         if(isNeg<0)
  14.                 str[i++] = '-';
  15.         str[i] = '\0';
  16.         Reverse(str,_strlen(str));
  17.         return str;
  18. }
复制代码
  1. void Reverse(char *str,int len)
  2. {
  3.         if(NULL == str  || len <= 1)
  4.                 return;
  5.         char strtemp = *str;
  6.         *str = *(str + len - 1);
  7.         *(str + len - 1) = strtemp;
  8.         Reverse(str+1,len-2);
  9. }
复制代码
  1. size_t _strlen(char *str)
  2. {
  3. <span style="white-space:pre">        </span>return (NULL == str || *str == '\0') ? 0 : _strlen(str+1) + 1;
  4. }
复制代码
点击按钮快速添加回复内容: 支持 高兴 激动 给力 加油 苦寻 生气 回帖 路过 感恩
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

小黑屋|手机版|Archiver|看流星社区 |网站地图

GMT+8, 2024-3-19 10:59

Powered by Kanliuxing X3.4

© 2010-2019 kanliuxing.com

快速回复 返回顶部 返回列表