今天看了位运算,位运算效率远高于乘法和除法,很有代表性的一种方法是用(n-1)&n可以使得n最右边位的1变为0。

大数量的乘方为了提高效率也需要运用位运算。

浮点型数开整数方,第一次未通过因为遗漏返回值

class Solution {
public:
double powerResult(double base, unsigned int expNum) {
int result = base;
while(expNum > 1) {
result *= result;
expNum /= 2;
}
return result;
};
double Power(double base, int exponent) {
//if(base == 0 && exponent < 0)
// pass;
if(exponent == 0)
return 1;
unsigned int expNum = (unsigned int)exponent;
if(exponent < 0)
expNum = (unsigned int)(- exponent);
double result = powerResult(base, expNum);
if((expNum & 1) == 1)
result = base * result;
if(exponent < 0)
result = 1 / result;
return result;
};
};

请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+100","5e2","-123","3.1416"和"-1E-16"都表示数值。 但是"12e","1a3.14","1.2.3","+-5"和"12e+4.3"都不是。

class Solution {
public:
int finds(const char *string, char c, size_t pos) {
for(size_t i = pos; i < strlen(string); ++i)
if(string[i] == c)
return i;
return 10000;
};
int timeDot(char *string) {
int count = 0;
for(size_t i = 0; i < strlen(string); i++)
if(string[i] == '.')
++count;
return count;
};
bool isNum1(char *string) {
const char *str1 = "1234567890.+-";
size_t found1 = finds(string, '-', 1);
size_t found2 = finds(string, '+', 1);
size_t found3 = finds(string, '.', 0);
if(timeDot(string) > 1)
return false;
if(found1 != 10000 || found2 != 10000)
return false;
if(found3 == strlen(string - 1))
return false;
for(size_t i = 0; i < strlen(string) - 1; ++i) {
if(finds(str1, string[i], 0) != 10000)
continue;
else
return false;
}
return true;
};
bool isNum2(char *string) {
if(timeDot(string) > 0)
return false;
return isNum1(string);
};
int timeE(char *string) {
int count = 0;
for(size_t i = 0; i < strlen(string); ++i)
if(string[i] == 'e' || string[i] == 'E')
++count;
return count;
};
int isE(char *string) {
for(size_t i = 0; i < strlen(string); ++i)
if(string[i] == 'e' || string[i] == 'E')
return i;
return -1;
};
bool isNumeric(char* string){
int len = strlen(string);
int fpE = isE(string);
if(timeE(string) > 1 || (timeE(string) == 1 && fpE == len - 1))
return false;
else if(timeE(string) == 1) {
char *str1 = new char[fpE + 1];
for(size_t i = 0; i < (size_t)fpE; ++i)
str1[i] = string[i];
str1[fpE] = '\0';
return isNum1(str1) && isNum2(&string[fpE + 1]);
}
else
return isNum1(string);
};
};

漫长的面向过程,先找到E/e确定其是否唯一,如果是将原字符串以E/e为界限分成两段,分别判断。前一段可以含有一个小数点,后一段不可。

正负号只有存在于第一位才是表示数字。

posted on 2017-07-11 00:18  bloomingFlower  阅读(168)  评论(0编辑  收藏  举报