将整数字符串转成整数型
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判断正负数,并输出正确的数字。
代码:
给定一个字符串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; }
相关文章推荐
- iOS-面试题整理
- 在jsp上 设置时间格式
- 第七周实践项目1————线段类——成员函数、友元函数和一般函数的综合及学习心得
- 谁再说Matlab速度慢,我跟谁急
- 第六周作业
- EF增删改查操作
- 第七周项目1-点类-友元函数
- Java中equals和==的区别
- text detection method
- 软件工程结对作业02(原创版)
- script 的运行方式差异 (source, sh script, ./script)
- HDU 1978 How many ways 记忆化dfs+dp
- leetcode---Path Sum
- 一些JS事件
- 可拖拽GridView代码解析
- 2010年山东省第一届ACM解SDUT2151-2160 set,floyd变形
- 汉诺塔递归算法
- Whu oj 1609 - Han Move
- 软件工程结对作业02(借鉴版)
- JavaScript编写人机对战五子棋(七)