《劍指offer》:[54]表示數值的字符串

題目:請實現一個函數用來判斷字符串是否表示數值(包括整數和小數)。
例如,字符串“+100”,“5e2”,“-123”,“3.1416”及”-1E-16”都表示數值,但“12e”,”1a3.14”,”1.2.3”,”+-5”及“12e+5.4”都不是。 

分析:這個題主要是應用數字的表示通式來解決:表示一個數字的通式爲:
                           [sign]integral-digits[.[fractional-digits]][e|E[sign]exponential-digits]('['和']'之間的數據都是可有可無的,可省略)
表達的意思是:[符號]整型數字[小數點[小數整數]][e|E[指數的符號]指數的整數表示].按照這個步驟思路來判斷就不會錯。
   看一個字符串是否符合上述模式時,首先看第一個字符是不是正負號。如果是,在字符串上移動一個字符,繼續掃描剩餘的字符串中0到9的數位。如果是一個小數,則可能遇到小數點。另外如果是科學計數法,則在小數點的後面可能遇到e|E。
具體實現代碼如下:
#include <iostream>
using namespace std;
void ScanDigits(char **str) //判斷是否是0-9之間的數字;
{
	while(**str!='\0' && **str>='0' && **str<='9')
		++(*str);
}
bool IsExponential(char **str)//判斷e或E之後的表達式是否合法:符號+數字;
{
	if(**str!='e' && **str!='E')
		return false;
	++(*str);
	if(**str=='+' || **str=='-')
		++(*str);
	if(**str=='\0')
		return false;
	ScanDigits(str);
	return (**str=='\0')?true:false;
}
bool IsNumber(char *str)
{
	if(str==NULL)
		return false;
	if(*str=='+' || *str=='-') //判斷符號;
		++str;
	if(*str=='\0')
		return false;
	bool numeric=true;
	ScanDigits(&str);
	if(*str!='\0')
	{
		//如果是浮點數;
		if(*str=='.')
		{
			str++;
			ScanDigits(&str);
			if(*str=='e' || *str=='E')
				numeric=IsExponential(&str);
		}
		//如果是整型數的科學計數法;
		else if(*str=='e' || *str=='E')
			numeric=IsExponential(&str);
		else
			numeric=false;
	}
	return numeric && *str=='\0';
}
int main()
{
	char *strr[4]={"5e2","-1E-16","12e+5.4","12e"};
	for(int i=0;i<4;i++)
	{
		if(IsNumber(strr[i]))
			cout<<strr[i]<<":  YES!"<<endl;
		else
			cout<<strr[i]<<":  NO!"<<endl;
	}
	system("pause");
	return 0;
}

運行結果:


發佈了250 篇原創文章 · 獲贊 191 · 訪問量 57萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章