完美atoi,哈哈
/*
atoi算法,要求完美版
有两种,一种是用longlong,一种是真用int
“”
" "
“-”
“+”
“ -23”
“ +23”
“12a"
"abc"
越界情况
*/
#include <iostream>
using namespace std; //方法一用 long long 取巧
int atoi(const char * str,bool & flag)
{
long long result=;
int tmp;
int sign=;
if(str==NULL)
{
flag=false;
return ;
}
while(isspace(*str))
str++;
//if(*str=='\0')
//{
// flag=false;
// return 0;
//}
if(*str=='+'||*str=='-')
{
if(*str=='-')
sign=-;
str++;
}
if(*str=='\0') //” “和”+“ ,”-“的情况
{
flag=false;
return ;
}
while(*str>=''&&*str<='')
{
tmp=*str-'';
result=result*+tmp;
if(sign==-)
{
if(result->INT_MAX) //这里注意,如果是INT_MAX+1,系统或默认转换成int,导致越界,所以用result-1,result是longlong不会越界
{
result=INT_MAX+;
flag=false;
break;
}
}
else if(result>INT_MAX)
{
result=INT_MAX;
flag=false;
break;
}
str++;
}
if(*str=='\0')
flag=true;
else
flag=false;
return sign*result;
} //方法二 用int
int atoi2(const char * str ,bool & flag)
{
int result=;
int sign=;
int tmp;
int MAX_DIV=INT_MAX/;
int MAX_R=INT_MAX%;
int MIN_R=MAX_R+; //或者为MIN_R=-(INT_MIN%10); //如果用(INT_MAX+1)%10就错了,直接加的时候越界
int MIN_DIV=(INT_MAX)/; //july用的是max=(int)((unsigned)~0>>1);
//min_r=(int)(((unsigned)~0>>1+1)%10);
if(str==NULL)
{
flag=false;
return result;
}
while(isspace(*str))
str++;
if(*str=='+'||*str=='-')
{
if(*str=='-')
sign=-;
str++;
}
if(*str=='\0')
{
flag=false;
return result;
}
while(*str>=''&&*str<='')
{
int tmp=*str-'';
if(sign==)
{
if(result>MAX_DIV||(result==MAX_DIV&&tmp>MAX_R))
{
result=INT_MAX;
flag=false;
return result;
}
}
else if(result>MIN_DIV||(result==MIN_DIV&&tmp>MIN_R))
{
result=INT_MIN; //result直接为最小-2147483648,直接返回了
flag=false;
return result;
}
result=result*+tmp;
str++;
}
if(*str=='\0')
flag=true;
else
flag=false;
return sign*result;
} int main()
{
char * str[]={""," ","abc",""," -1234"," +34"," 12bc","+","-","+++","","","+2147483648","-2147483648","-2147483649","+12123131312432342"," -122323434534534654"};
//cout<<INT_MAX<<endl;
int n=;
bool flag;
for(int i=;i<n;i++)
{
int tmp=atoi2(str[i],flag);
if(tmp==)
{
if(flag==false)
cout<<str[i]<<" 错误数据转换为: "<<tmp<<endl;
else
cout<<str[i]<<" 转换为: "<<tmp<<endl;
}
else
{
cout<<str[i]<<" 转换为: "<<tmp<<endl;
}
}
system("pause");
}
完美atoi,哈哈的更多相关文章
- libcurl使用easy模式阻塞卡死等问题的完美解决
引言: 由于要在android手机测进行DM开发, 其中最重要的就是FUMO和SCOMO下载, 下载使用的是linux开源库libcurl. 于是就把libcurl的使用研究了一遍, 有些心得, 并解 ...
- 代码的坏味道(22)——不完美的库类(Incomplete Library Class)
坏味道--不完美的库类(Incomplete Library Class) 特征 当一个类库已经不能满足实际需要时,你就不得不改变这个库(如果这个库是只读的,那就没辙了). 问题原因 许多编程技术都建 ...
- Visual Studio Code,完美的编辑器
今日凌晨,微软的文本(代码)编辑器 Visual Studio Code(简称 VS Code),发布了首个正式版,距离首个 beta 版上线时间刚好一年. 在十多年的编程经历中,我使用过非常多的的代 ...
- 完美解决,浏览器下拉显示网址问题 | 完美解决,使用原生 scroll 写下拉刷新
在 web 开发过程中我们经常遇到,不想让用户下拉看到我的地址,也有时候在 div 中没有惯性滚动,就此也出了 iScroll 这种关于滚动条的框架,但是就为了一个体验去使用一个框架好像又不值得,今天 ...
- 浏览器自动刷新——基于Nodejs的Gulp LiveReload与VisualStudio完美结合。
本文版权桂博客园和作者吴双共同所有,转载和爬虫请注明原文地址 http://www.cnblogs.com/tdws/p/6016055.html 写在前面 大家好我是博客园的蜗牛,博客园的蜗牛就是我 ...
- HTML5 oninput实时监听输入框值变化的完美方案
在网页开发中经常会碰到需要动态监听输入框值变化的情况,如果使用 onkeydown.onkeypress.onkeyup 这个几个键盘事件来监测的话,监听不了右键的复制.剪贴和粘贴这些操作,处理组合快 ...
- 【repost】JavaScript完美运动框架的进阶之旅
运动框架的实现思路 运动,其实就是在一段时间内改变left.right.width.height.opactiy的值,到达目的地之后停止. 现在按照以下步骤来进行我们的运动框架的封装: 匀速运动. 缓 ...
- [LeetCode] Perfect Rectangle 完美矩形
Given N axis-aligned rectangles where N > 0, determine if they all together form an exact cover o ...
- [LeetCode] String to Integer (atoi) 字符串转为整数
Implement atoi to convert a string to an integer. Hint: Carefully consider all possible input cases. ...
随机推荐
- Nginx+uWSGI+bottle 在Linux上部署
在/data/lujianxing/bottle 文件夹中创建三个文件: bottle.py bottle的源文件 a.py from bottle import Bottle, run mybott ...
- 在jsp中运用ajax实现同一界面不跳转处理事件
目前,编写应用程序时有两种基本的选择: 桌面应用程序 Web应用程序 它们有什么区别呢?桌面应用程序一般很快(就在您的计算机上运行,不用等待互联网连接),具有漂亮的用户界面(通常和操作系统有关)和非凡 ...
- HIVE中内连接和左半连接不一致问题
一.理论 HIVE中都是按等值连接来统计的,理论上两种写法统计结果应该是一致的: 二.实际情况 但实际使用中发现两种写法会返回的结果,总会有一些差距虽然差别不大,但让人很是困惑. 三.原因 当使用jo ...
- MVC-登录并设置角色
1.新建一个类,设置角色: using System; using System.Collections.Generic; using System.Linq; using System.Text; ...
- IQKeyboredManager使用
这个库是一个单例,它一旦生效,全项目任何界面都有效.让它生效的代码可以写在任意位置,我写在AppDelegate里. 1 2 3 4 5 6 7 8 9 10 - (BOOL)application: ...
- 基于协同过滤的个性化Web推荐
下面这是论文笔记,其实主要是摘抄,这片博士论文很有逻辑性,层层深入,所以笔者保留的比较多. 看到第二章,我发现其实这片文章对我来说更多是科普,科普吧…… 一.论文来源 Personalized Web ...
- HDU 1400 (POJ 2411 ZOJ 1100)Mondriaan's Dream(DP + 状态压缩)
Mondriaan's Dream Problem Description Squares and rectangles fascinated the famous Dutch painter Pie ...
- UL LI 布局 TAB 切换条
web页面实现tab的功能有几种实现方式,下面是使用UL LI DIV方式实现的tab. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Tr ...
- Django单元测试(一)
Django测试框架非常简单,首选方法是使用python标准库中的unittest模块. Writing tests Django的单元测试使用python的unittest模块,这个模块使用基于类的 ...
- php陷阱:字符串和数字比较
PHP中的比较运算符有点诡异,很容易出错,现列出比较规则: 1.当两个字符进行大小比较时,是比较着这两个字符的ASCII码大小——这条很容易理解. 2.当两个字符串进行大小比较时,是从第一个字符开始, ...