|
- #include <iostream>
- template<typename ftype>
- ftype pow(ftype f, int n)
- {
- if (n > 0)
- {
- if (n & 1)
- return pow(f * f, n >> 1) * f;
- else
- return pow(f * f, n >> 1);
- }
- else
- {
- if (n < 0)
- return pow(1.0f / f, -n);
- else
- return 1;
- }
- }
- template<typename ftype>
- bool num(const char * str, ftype & d)
- {
- enum state
- {
- s_init,
- s_fail,
- s_wait_dot,
- s_wait_num,
- s_wait_num2,
- s_wait_num3,
- s_wait_num4,
- s_wait_num5,
- s_wait_num6,
- s_wait_num7,
- s_wait_e,
- s_ready_n1,
- s_ready_n2,
- s_finish,
- };
- int n;
- ftype i, f;
- state s = s_init;
- char * x = const_cast<char *>(str);
- for (; *x && s != s_fail && s != s_finish; x++)
- {
- switch (s)
- {
- case s_init:
- {
- if (*x != ' ')
- {
- if (*x >= '1' && *x <= '9')
- {
- f = *x - '0';
- s = s_wait_num;
- }
- else
- {
- if (*x == '0')
- {
- s = s_wait_dot;
- }
- else
- {
- if (*x == '.')
- s = s_wait_num2;
- else
- s = s_fail;
- }
- }
- }
- }
- break;
- case s_wait_dot:
- {
- if(*x == '.')
- {
- i = 1.0f;
- s = s_wait_num2;
- }
- else
- {
- s = s_finish;
- }
- }
- break;
- case s_wait_num:
- {
- if (*x >= '0' && *x <= '9')
- {
- f = f * 10 + (*x - '0');
- s = s_wait_num3;
- }
- else
- {
- if (*x == '.')
- {
- i = 1.0f;
- s = s_wait_num4;
- }
- else
- {
- if (*x == 'e' || *x == 'E')
- {
- s = s_wait_num5;
- }
- else
- {
- s = s_finish;
- }
- }
- }
- }
- break;
- case s_wait_num2:
- {
- if (*x >= '0' && *x <= '9')
- {
- i = i / 10;
- f = f + i * (*x - '0');
- s = s_wait_e;
- }
- else
- {
- s = s_fail;
- }
- }
- break;
- case s_wait_num3:
- {
- if (*x >= '0' && *x <= '9')
- {
- f = f * 10 + (*x - '0');
- }
- else
- {
- if (*x == '.')
- {
- i = 1.0f;
- s = s_wait_num2;
- }
- else
- {
- if (*x == 'e' || *x == 'E')
- {
- s = s_wait_num5;
- }
- else
- {
- s = s_finish;
- }
- }
- }
- }
- break;
- case s_wait_num4:
- {
- if (*x >= '0' && *x <= '9')
- {
- i = i / 10;
- f = f + i * (*x - '0');
- s = s_wait_e;
- }
- else
- {
- s = s_fail;
- }
- }
- break;
- case s_wait_e:
- {
- if (*x >= '0' && *x <= '9')
- {
- i = i / 10;
- f = f + i * (*x - '0');
- }
- else
- {
- if (*x == 'e' || *x == 'E')
- {
- s = s_wait_num5;
- }
- else
- {
- s = s_finish;
- }
- }
- }
- break;
- case s_wait_num5:
- {
- if (*x >= '1' && *x <= '9')
- {
- n = *x - '0';
- s = s_ready_n1;
- }
- else
- {
- if (*x == '-')
- {
- s = s_wait_num6;
- }
- else if (*x == '+')
- {
- s = s_wait_num7;
- }
- else
- {
- s = s_fail;
- }
- }
- }
- break;
- case s_wait_num6:
- {
- if (*x >= '1' && *x <= '9')
- {
- n = - (*x - '0');
- s = s_ready_n2;
- }
- else
- {
- s = s_fail;
- }
- }
- break;
- case s_wait_num7:
- {
- if (*x >= '1' && *x <= '9')
- {
- n = *x - '0';
- s = s_ready_n1;
- }
- else
- {
- s = s_fail;
- }
- }
- break;
- case s_ready_n1:
- {
- if (*x >= '0' && *x <= '9')
- {
- n = n * 10 + (*x - '0');
- }
- else
- {
- s = s_finish;
- }
- }
- break;
- case s_ready_n2:
- {
- if (*x >= '0' && *x <= '9')
- {
- n = n * 10 - (*x - '0');
- }
- else
- {
- s = s_finish;
- }
- }
- break;
- default:
- {
- s = s_fail;
- }
- break;
- }
- }
- state a[] = {
- s_wait_dot,
- s_wait_num,
- s_wait_num3,
- s_wait_e,
- s_ready_n1,
- s_ready_n2,
- s_finish,
- };
- for (int j = 0; j < sizeof(a) / sizeof(a[0]); j++)
- if (a[j] == s) {
- if (s == s_ready_n1 || s == s_ready_n2)
- d = f * pow(10.0f, n);
- else
- d = f;
- return true;
- }
- return false;
- }
- int main()
- {
- char buff[2048];
- std::cin >> buff;
- double f;
- if (num(buff, f))
- {
- std::cout << f << std::endl;
- }
- return 0;
- }
复制代码 |
|