开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

用微信号发送消息登录论坛

新人指南 邀请好友注册 - 我关注人的新帖 教你赚取精币 - 每日签到


求职/招聘- 论坛接单- 开发者大厅

论坛版规 总版规 - 建议/投诉 - 应聘版主 - 精华帖总集 积分说明 - 禁言标准 - 有奖举报

查看: 1286|回复: 3
收起左侧

[源码分享] 数的识别

[复制链接]

结帖率:63% (5/8)
发表于 2013-8-3 15:35:07 | 显示全部楼层 |阅读模式   江西省九江市
  1. #include <iostream>

  2. template<typename ftype>
  3. ftype pow(ftype f, int n)
  4. {
  5.     if (n > 0)
  6.     {
  7.         if (n & 1)
  8.             return pow(f * f, n >> 1) * f;
  9.         else
  10.             return pow(f * f, n >> 1);
  11.     }
  12.     else
  13.     {
  14.         if (n < 0)
  15.             return pow(1.0f / f, -n);
  16.         else
  17.             return 1;
  18.     }
  19. }

  20. template<typename ftype>
  21. bool num(const char * str, ftype & d)
  22. {
  23.     enum state
  24.     {
  25.         s_init,
  26.         s_fail,
  27.         s_wait_dot,
  28.         s_wait_num,
  29.         s_wait_num2,
  30.         s_wait_num3,
  31.         s_wait_num4,
  32.         s_wait_num5,
  33.         s_wait_num6,
  34.         s_wait_num7,
  35.         s_wait_e,
  36.         s_ready_n1,
  37.         s_ready_n2,
  38.         s_finish,
  39.     };

  40.     int n;
  41.     ftype i, f;
  42.     state s = s_init;
  43.     char * x = const_cast<char *>(str);
  44.     for (; *x && s != s_fail && s != s_finish; x++)
  45.     {
  46.         switch (s)
  47.         {
  48.         case s_init:
  49.             {
  50.                 if (*x != ' ')
  51.                 {
  52.                     if (*x >= '1' && *x <= '9')
  53.                     {
  54.                         f = *x - '0';
  55.                         s = s_wait_num;
  56.                     }
  57.                     else
  58.                     {
  59.                         if (*x == '0')
  60.                         {
  61.                             s = s_wait_dot;
  62.                         }
  63.                         else
  64.                         {
  65.                             if (*x == '.')
  66.                                 s = s_wait_num2;
  67.                             else
  68.                                 s = s_fail;
  69.                         }
  70.                     }
  71.                 }
  72.             }
  73.             break;
  74.         case s_wait_dot:
  75.             {
  76.                 if(*x == '.')
  77.                 {
  78.                     i = 1.0f;
  79.                     s = s_wait_num2;
  80.                 }
  81.                 else
  82.                 {
  83.                     s = s_finish;
  84.                 }
  85.             }
  86.             break;
  87.         case s_wait_num:
  88.             {
  89.                 if (*x >= '0' && *x <= '9')
  90.                 {
  91.                     f = f * 10 + (*x - '0');
  92.                     s = s_wait_num3;
  93.                 }
  94.                 else
  95.                 {
  96.                     if (*x == '.')
  97.                     {
  98.                         i = 1.0f;
  99.                         s = s_wait_num4;
  100.                     }
  101.                     else
  102.                     {
  103.                         if (*x == 'e' || *x == 'E')
  104.                         {
  105.                             s = s_wait_num5;
  106.                         }
  107.                         else
  108.                         {
  109.                             s = s_finish;
  110.                         }
  111.                     }
  112.                 }
  113.             }
  114.             break;
  115.         case s_wait_num2:
  116.             {
  117.                 if (*x >= '0' && *x <= '9')
  118.                 {
  119.                     i = i / 10;
  120.                     f = f + i * (*x - '0');
  121.                     s = s_wait_e;
  122.                 }
  123.                 else
  124.                 {
  125.                     s = s_fail;
  126.                 }
  127.             }
  128.             break;
  129.         case s_wait_num3:
  130.             {
  131.                 if (*x >= '0' && *x <= '9')
  132.                 {
  133.                     f = f * 10 + (*x - '0');
  134.                 }
  135.                 else
  136.                 {
  137.                     if (*x == '.')
  138.                     {
  139.                         i = 1.0f;
  140.                         s = s_wait_num2;
  141.                     }
  142.                     else
  143.                     {
  144.                         if (*x == 'e' || *x == 'E')
  145.                         {
  146.                             s = s_wait_num5;
  147.                         }
  148.                         else
  149.                         {
  150.                             s = s_finish;
  151.                         }
  152.                     }
  153.                 }
  154.             }
  155.             break;
  156.         case s_wait_num4:
  157.             {
  158.                 if (*x >= '0' && *x <= '9')
  159.                 {
  160.                     i = i / 10;
  161.                     f = f + i * (*x - '0');
  162.                     s = s_wait_e;
  163.                 }
  164.                 else
  165.                 {
  166.                     s = s_fail;
  167.                 }
  168.             }
  169.             break;
  170.         case s_wait_e:
  171.             {
  172.                 if (*x >= '0' && *x <= '9')
  173.                 {
  174.                     i = i / 10;
  175.                     f = f + i * (*x - '0');
  176.                 }
  177.                 else
  178.                 {
  179.                     if (*x == 'e' || *x == 'E')
  180.                     {
  181.                         s = s_wait_num5;
  182.                     }
  183.                     else
  184.                     {
  185.                         s = s_finish;
  186.                     }
  187.                 }
  188.             }
  189.             break;
  190.         case s_wait_num5:
  191.             {
  192.                 if (*x >= '1' && *x <= '9')
  193.                 {
  194.                     n = *x - '0';
  195.                     s = s_ready_n1;
  196.                 }
  197.                 else
  198.                 {
  199.                     if (*x == '-')
  200.                     {
  201.                         s = s_wait_num6;
  202.                     }
  203.                     else if (*x == '+')
  204.                     {
  205.                         s = s_wait_num7;
  206.                     }
  207.                     else
  208.                     {
  209.                         s = s_fail;
  210.                     }
  211.                 }
  212.             }
  213.             break;
  214.         case s_wait_num6:
  215.             {
  216.                 if (*x >= '1' && *x <= '9')
  217.                 {
  218.                     n = - (*x - '0');
  219.                     s = s_ready_n2;
  220.                 }
  221.                 else
  222.                 {
  223.                     s = s_fail;
  224.                 }
  225.             }
  226.             break;
  227.         case s_wait_num7:
  228.             {
  229.                 if (*x >= '1' && *x <= '9')
  230.                 {
  231.                     n = *x - '0';
  232.                     s = s_ready_n1;
  233.                 }
  234.                 else
  235.                 {
  236.                     s = s_fail;
  237.                 }
  238.             }
  239.             break;
  240.         case s_ready_n1:
  241.             {
  242.                 if (*x >= '0' && *x <= '9')
  243.                 {
  244.                     n = n * 10 + (*x - '0');
  245.                 }
  246.                 else
  247.                 {
  248.                     s = s_finish;
  249.                 }
  250.             }
  251.             break;
  252.         case s_ready_n2:
  253.             {
  254.                 if (*x >= '0' && *x <= '9')
  255.                 {
  256.                     n = n * 10 - (*x - '0');
  257.                 }
  258.                 else
  259.                 {
  260.                     s = s_finish;
  261.                 }
  262.             }
  263.             break;
  264.         default:
  265.             {
  266.                 s = s_fail;
  267.             }
  268.             break;
  269.         }
  270.     }

  271.     state a[] = {
  272.         s_wait_dot,
  273.         s_wait_num,
  274.         s_wait_num3,
  275.         s_wait_e,
  276.         s_ready_n1,
  277.         s_ready_n2,
  278.         s_finish,
  279.     };

  280.     for (int j = 0; j < sizeof(a) / sizeof(a[0]); j++)
  281.         if (a[j] == s) {
  282.             if (s == s_ready_n1 || s == s_ready_n2)
  283.                 d = f * pow(10.0f, n);
  284.             else
  285.                 d = f;
  286.             return true;
  287.         }
  288.     return false;
  289. }

  290. int main()
  291. {
  292.     char buff[2048];
  293.     std::cin >> buff;

  294.     double f;
  295.     if (num(buff, f))
  296.     {
  297.         std::cout << f << std::endl;
  298.     }
  299.     return 0;
  300. }
复制代码

结帖率:57% (13/23)
发表于 2013-8-3 15:38:28 | 显示全部楼层   广东省惠州市
前排支持,,,
回复 支持 反对

使用道具 举报

结帖率:63% (5/8)

签到天数: 9 天

 楼主| 发表于 2013-8-3 15:37:32 | 显示全部楼层   江西省九江市
米和饭 发表于 2013-8-3 15:35
呵呵,你被刷下来了。。。看来竞争很激烈。。。

我看这三天这么快  所以我也来凑凑热闹
回复 支持 反对

使用道具 举报

结帖率:90% (9/10)
发表于 2013-8-3 15:35:59 | 显示全部楼层   广东省梅州市
呵呵,你被刷下来了。。。看来竞争很激烈。。。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 致发广告者

发布主题 收藏帖子 返回列表

sitemap| 易语言源码| 易语言教程| 易语言论坛| 易语言模块| 手机版| 广告投放| 精易论坛
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表精易立场!
论坛帖子内容仅用于技术交流学习和研究的目的,严禁用于非法目的,否则造成一切后果自负!如帖子内容侵害到你的权益,请联系我们!
防范网络诈骗,远离网络犯罪 违法和不良信息举报电话0663-3422125,QQ: 793400750,邮箱:wp@125.la
Powered by Discuz! X3.4 揭阳市揭东区精易科技有限公司 ( 粤ICP备12094385号-1) 粤公网安备 44522102000125 增值电信业务经营许可证 粤B2-20192173

快速回复 返回顶部 返回列表