• 完美atoi,哈哈


      1 /*
      2 atoi算法,要求完美版
      3 有两种,一种是用longlong,一种是真用int
      4 “”
      5 "  "
      6 “-”
      7 “+”
      8 “  -23”
      9 “  +23”
     10 “12a"
     11 "abc"
     12 越界情况
     13 */
     14 #include <iostream>
     15 using namespace std;
     16 
     17 //方法一用 long long 取巧
     18 int atoi(const char * str,bool & flag)
     19 {
     20     long long result=0;
     21     int tmp;
     22     int sign=1;
     23     if(str==NULL)
     24     {
     25         flag=false;
     26         return 0;
     27     }
     28     while(isspace(*str))
     29         str++;
     30     //if(*str=='')
     31     //{
     32     //    flag=false;
     33     //    return 0;
     34     //}
     35     if(*str=='+'||*str=='-')
     36     {
     37         if(*str=='-')
     38             sign=-1;
     39         str++;
     40     }
     41     if(*str=='')                     //”    “和”+“ ,”-“的情况
     42     {
     43         flag=false;
     44         return 0;
     45     }
     46     while(*str>='0'&&*str<='9')
     47     {
     48         tmp=*str-'0';
     49         result=result*10+tmp;
     50         if(sign==-1)
     51         {
     52             if(result-1>INT_MAX)           //这里注意,如果是INT_MAX+1,系统或默认转换成int,导致越界,所以用result-1,result是longlong不会越界
     53             {
     54                 result=INT_MAX+1;
     55                 flag=false;
     56                 break;
     57             }
     58         }
     59         else if(result>INT_MAX)
     60         {
     61             result=INT_MAX;
     62             flag=false;
     63             break;
     64         }
     65         str++;
     66     }
     67     if(*str=='')
     68         flag=true;
     69     else
     70         flag=false;
     71     return sign*result;
     72 }
     73 
     74 //方法二 用int
     75 int atoi2(const char * str ,bool & flag)
     76 {
     77     int result=0;
     78     int sign=1;
     79     int tmp;
     80     int MAX_DIV=INT_MAX/10;
     81     int MAX_R=INT_MAX%10;
     82     int MIN_R=MAX_R+1;   //或者为MIN_R=-(INT_MIN%10);    //如果用(INT_MAX+1)%10就错了,直接加的时候越界
     83     int MIN_DIV=(INT_MAX)/10;        
     84 
     85     //july用的是max=(int)((unsigned)~0>>1);
     86     //min_r=(int)(((unsigned)~0>>1+1)%10);
     87     if(str==NULL)
     88     {
     89         flag=false;
     90         return result;
     91     }
     92     while(isspace(*str))
     93         str++;
     94     if(*str=='+'||*str=='-')
     95     {
     96         if(*str=='-')
     97             sign=-1;
     98         str++;
     99     }
    100     if(*str=='')
    101     {
    102         flag=false;
    103         return result;
    104     }
    105     while(*str>='0'&&*str<='9')
    106     {
    107         int tmp=*str-'0';
    108         if(sign==1)
    109         {
    110             if(result>MAX_DIV||(result==MAX_DIV&&tmp>MAX_R))
    111             {
    112                 result=INT_MAX;
    113                 flag=false;
    114                 return result;
    115             }
    116         }
    117         else if(result>MIN_DIV||(result==MIN_DIV&&tmp>MIN_R))
    118         {
    119             result=INT_MIN;                                               //result直接为最小-2147483648,直接返回了
    120             flag=false;
    121             return result;
    122         }
    123         result=result*10+tmp;
    124         str++;
    125     }
    126     if(*str=='')
    127         flag=true;
    128     else
    129         flag=false;
    130     return sign*result;
    131 }
    132 
    133 
    134 
    135 int main()
    136 {
    137     char * str[]={""," ","abc","  123","  -1234","   +34","  12bc","+","-","+++","0","2147483647","+2147483648","-2147483648","-2147483649","+12123131312432342","   -122323434534534654"};
    138     //cout<<INT_MAX<<endl;
    139     int n=17;
    140     bool flag;
    141     for(int i=0;i<n;i++)
    142     {
    143         int tmp=atoi2(str[i],flag);
    144         if(tmp==0)
    145         {
    146             if(flag==false)
    147                 cout<<str[i]<<" 错误数据转换为: "<<tmp<<endl;
    148             else
    149                 cout<<str[i]<<" 转换为: "<<tmp<<endl;
    150         }
    151         else
    152         {
    153         cout<<str[i]<<" 转换为: "<<tmp<<endl;
    154         }
    155     }
    156     system("pause");
    157 }
  • 相关阅读:
    selenium之鼠标事件
    selenium+python 自动化
    软件工程课堂训练——有多少个1?
    软件工程课堂训练———找三个小水王
    软件工程课堂训练——找水王
    课堂训练——电梯调度
    软件工程课堂训练————最便宜购书方案
    软件工程课堂训练——结对开发之环状二维数组
    软件工程课堂训练——结对开发之环数组最大和
    软件工程课堂训练——数组之大数溢出
  • 原文地址:https://www.cnblogs.com/zmlctt/p/3866658.html
Copyright © 2020-2023  润新知