您的位置:首页 > 其它

将整数字符串转成整数型

2016-04-09 19:50 225 查看
题目:

给定一个字符串str,如果str符合日常书写的整数形式,并且属于32位整数的范围,返回str所代表的整数值,否则返回0.

举例:

str="123",返回123;

str="023",因为"023"不符合日常的书写习惯,返回0;

str="A13",返回0;

str="0",返回0;

str="2147483647",返回2147483647;

str="2147483648",因为溢出,返回0;

str="-123",返回-123。

难度:

思路:

该题分两步,一判断书写形式是否符合日常规范,若符合,进行下一步;若不符合,则直接退出。二将证书字符串转成整数值,并且判断是否溢出。

注意:在C++语言中,int类型的边界值是根据存储位数决定的,因此需要利用公式或者现成的函数取得int类型的最小值(负数)。

首先,对于书写规范的判断,一定要考虑全面。

情形1,用户什么都没有输入,可通过字符串的长度为0判别,返回false;

因为可能有"-"字符的存在,需要单独对首字符进行判断。

情形2,首字符为"-"且长度为1,说明字符串就是"-",不符合书写要求,返回false;

情形3,首字符为"-",长度大于1,且第二字符为0,说明字符串形如"-0%",不符合书写要求,返回false(%为任意长度的字符串);

情形4,首字符为"0",且长度大于1,说明字符串形如"0%",不符合书写要求,返回false;

情形5,从下标1开始遍历整个字符串,只要出现非数字字符,返回false;

情形6,以上5种情形均不符合,则说明字符串符合书写要求,返回true。

其次,对整数字符串进行转换,遍历期间,需要注意对于数值是否超过最小值或最大值的判断。

一般,int类型整数的最小值为-2147483648,最大值为2147483647。可以看出,最小值的最大值比最大值的绝对值大1,因此转换过程中的绝对值一律以负数形式出现,然后根据flag最后决定返回什么。

对于遍历的初始下标,根据flag决定是0还是1。遍历过程中num是否溢出的判断假设当前字符为ch,则'0'-ch是当前字符所代表的数字的负数形式。若num加上'0'-ch前发现num小于MINQ,则num加上"0"-ch一定溢出;或者若num加上"0"-ch前发现num等于MINQ,且当前字符"0"-ch小于MINR,则num加上"0"-ch一定溢出。

以上都是对于负数形式的数字进行判断,而对于正整数,其最大值比最小值的绝对值小1,因此遍历结束后判断flag==0且num==MIN,则说明溢出。

最后,根据flag判断正负数,并输出正确的数字。

代码:

#include <iostream>
#include <string>
#define MIN -int(pow(2,8*sizeof(int)))
#define MINQ -pow(2,8*sizeof(int))/10
#define MINR -int(pow(2,8*sizeof(int)))%10
using namespace std;
bool isValid(string str,int len)
{
int i = 0;
if (str[i] == '-'&&len == 1)
return false;
else if (str[i] == '-'&&len > 1&&str[i + 1] == '0')
return false;
else if (!isdigit(str[i]) && str[i] != '-')
return false;
else if (str[i] == '0'&&len > 1)
return false;
for (i = 1; i < len; i++)
{
if (!isdigit(str[i]))
return false;
}
return true;
}
int main()
{
string str;
getline(cin, str);
int len = str.size();
if (len == 0)
{
cout << -1; return 0;
}
if (!isValid(str, len))
{
cout << -1; return 0;
}
int val = 0, num = 0, i, flag = 0;
if (str[0] == '-')
flag = 1;
for (i = (flag ? 1 : 0); i < len; i++)
{
if (num<MINQ || (num == MINQ && (str[i] - '0'>MINR)))
{
cout << -1;
return 0;
}
num = num * 10 - (str[i] - '0');
}
if (flag == 0 && num == MIN)
{
cout << -1;
return 0;
}
cout << (flag ? num : -num) << endl;
system("pause");
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: