完美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==‘\0‘)
 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==‘\0‘)                     //”    “和”+“ ,”-“的情况
 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==‘\0‘)
 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==‘\0‘)
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==‘\0‘)
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 }

完美atoi,哈哈,布布扣,bubuko.com

时间: 2025-01-30 05:59:11

完美atoi,哈哈的相关文章

九度OJ 1375 陈博的完美主义 (枚举,细心细心)

题目1375:陈博的完美主义(25分) 时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:1158 解决:287 题目描述: 上一回合大家都知道,在JOBDU团队里,陈博是最讲平均主义的人,对数字十分敏感.事实上,他还是个数字完美主义者.例如看到N个数字的时候,从1到N的每个数都需要在其中出现且仅出现一次,否则他就觉得这个数字序列不完美.后来,我明白了:这是排列! 对于一个整数序列d1, d2, d3 ... dn,你是否能够算出至少改变其中的几个数,才能把他们变成从1到N的一个排列?例

[转]完美洗牌(Perfect Shuffle)问题

[转]原博文地址:https://github.com/julycoding/The-Art-Of-Programming-By-July/blob/master/ebook/zh/02.09.md 完美洗牌算法 题目详情 有个长度为2n的数组{a1,a2,a3,...,an,b1,b2,b3,...,bn},希望排序后{a1,b1,a2,b2,....,an,bn},请考虑有无时间复杂度o(n),空间复杂度0(1)的解法. 题目来源:此题是去年2013年UC的校招笔试题,看似简单,按照题目所要

MapGIS6.7安装图文教程(完美破解)

mapgis安装比较简单,主要注意在安装的时候,先打开软件狗,然后再进行软件安装,一般就不会照成其他安装失败的现象,有时候安装之前没有打开软件狗也安装成功了,也有这情况,不过软件使用也需要软件狗的支持!MapGIS6.7安装图文教程(完美破解)工具/原料 MapGIS6.7安装包和软件狗 电脑(现在的电脑配置都可以安装) 方法/步骤 1 打开软件狗,注意防火墙,可能会阻止打开 MapGIS6.7安装图文教程(完美破解) 2 点击SETUP67.EXE,如图,进行mapgis安装 MapGIS6.

LeetCode:String to Integer (atoi)

1.题目名称 String to Integer (atoi) (字符串到数字的转换) 2.题目地址 https://leetcode.com/problems/string-to-integer-atoi/ 3.题目内容 英文:Implement atoi to convert a string to an integer. 中文:实现atoi函数,将输入的字符串(String类型)转换为整型数据(Integer类型) 提示:实现的atoi函数需要满足以下特征 忽略字符串第一个非空格字符前的所

String to Integer (atoi) leetcode

题目的意思是要将一个字符串转换成数字 这个题目的重点是要处理    各种各样的输入情况 在题目下面有一大段英文: Requirements for atoi: The function first discards as many whitespace characters as necessary until the first non-whitespace character is found. Then, starting from this character, takes an opt

Linux下完美使用find+grep实现全局代码搜索

作者:zhanhailiang 日期:2014-10-11 背景 在Window下有大量方便的图形化工具可以实现全局搜索,但是Linux服务器中由于使用命令行操作导致全局搜索是一个比较高的门槛. 第一种方法 首先,举个最简单的例子,在阅读代码过程中我们经常需要查看某个函数的定义,但是一般开源项目代码规模都相当庞大,此时你就可以如下使用find+grep轻松查找到该函数的定义,譬如,我想在php源码中搜索is_array方法的定义,如下: [[email protected] standard]#

”乳罩图“ 的完美匹配:高温展开与顶点膨胀技巧

本文的目的是通过一个例子来介绍统计力学中精确可解模型的两个经典方法:高温展开和顶点膨胀. 问题是这样的:考虑这样一张非常类似 "bra" 的图: 注意这个图不是平面图!上面两条实线的边与下面两条实线的边分别是粘在一起的,左边两条实线的边和右边的两条实线的边也是分别粘合的:虚线部分不是边,只是用来描述粘合定向的.因此这个图的每个顶点的度数都是 3. 想象它的立体图:这是一个乳罩,已经穿戴在某个美女身上,则上下和左右的实线边相当于系的绳子. 问这个图有多少不同的完美匹配? 答案是 $64$

完美分页

<?php header("Content-Type:text/html;charset=utf-8"); class Page { private $total; //数据表中总记录数 private $listRows; //每页显示行数 private $limit; private $uri; private $pageNum; //页数 private $config=array('header'=>"个记录", "prev"

Leetcode 数 String to Integer (atoi)

本文为senlie原创,转载请保留此地址:http://blog.csdn.net/zhengsenlie String to Integer (atoi) Total Accepted: 9862 Total Submissions: 67880 Implement atoi to convert a string to an integer. Hint: Carefully consider all possible input cases. If you want a challenge,