查看: 5585|回复: 25
收起左侧

Facebook(1) : 简单的计算程序

  |只看干货 |刷题
头像被屏蔽

分享帖子到朋友圈
wwwyhx | 显示全部楼层 |阅读模式
提示: 作者被禁止或删除 内容自动屏蔽

上一篇:Microsoft(3) 最长重复子串
下一篇:感叹:提高算法真不是一天两天的事
joshua.cong 2011-4-21 12:01:26 | 显示全部楼层
本楼: 👍   0% (0)
 
 
0% (0)   👎
全局: 👍   98% (215)
 
 
1% (4)    👎
没有括号??? 首先用pattern识别-,+,于是每个clause都是只有* or /的式子,分别计算就行了。。

有括号,就用树什么的,波兰式。。
回复

使用道具 举报

darksteel 2011-4-21 13:08:33 | 显示全部楼层
本楼: 👍   0% (0)
 
 
0% (0)   👎
全局: 👍   100% (32)
 
 
0% (0)    👎
代码如下:
支持正负浮点数,没有错误检查。
  1. #include <iostream>
  2. #include <cstdio>
  3. using namespace std;
  4. char c;
  5. double num() {
  6.         double ret = 0;
  7.         while(c=getc(stdin)) {
  8.                 if(c >= '0' && c <= '9')
  9.                         ret = ret * 10 + c-'0';
  10.                 else break;
  11.         }
  12.         double dec = 0.1;
  13.         if(c=='.') {
  14.                 while(c=getc(stdin)) {
  15.                         if(c >= '0' && c <= '9') {
  16.                                 ret += dec*(c-'0');
  17.                                 dec /= 10;
  18.                         }
  19.                         else break;
  20.                 }
  21.         }
  22.         return ret;
  23. }
  24. double calc_mul()
  25. {
  26.         double ret = num();
  27.         while(c=='*'||c=='/') {
  28.                 ret = c=='*'?ret*num():ret/num();
  29.         }
  30.         return ret;
  31. }
  32. double calc_add()
  33. {
  34.         double ret = calc_mul();
  35.         while(c=='+'||c=='-') {
  36.                 ret = c=='+'?ret+calc_mul():ret-calc_mul();
  37.         }
  38.         return ret;
  39. }
  40. int
  41. main() {
  42.         cout << calc_add() << endl;
  43.         return 0;
  44. }
复制代码

评分

参与人数 1大米 +45 收起 理由
wwwyhx + 45

查看全部评分

回复

使用道具 举报

头像被屏蔽
 楼主| wwwyhx 2011-4-21 13:22:15 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

vvnesaa 2011-4-21 13:38:40 | 显示全部楼层
本楼: 👍   0% (0)
 
 
0% (0)   👎
全局: 👍   100% (38)
 
 
0% (0)    👎
本帖最后由 vvnesaa 于 2011-4-21 13:39 编辑

贴个非递归。。。GG写的特别好看>_<
  1. #include <iostream>
  2. #include <functional>
  3. #include <algorithm>

  4. using namespace std;
  5. using namespace std::placeholders;

  6. int getInt()
  7. {
  8.        int result = 0;
  9.        while (true)
  10.        {
  11.                while (isspace(cin.peek()))     cin.get();
  12.                if (!isdigit(cin.peek()))       return result;
  13.                result = result * 10 + (cin.get() - '0');
  14.        }
  15. }

  16. char getOp()
  17. {
  18.        while (true)
  19.        {
  20.                if (cin.eof())  return '[/color];
  21.                if (isspace(cin.peek()))
  22.                        cin.get();
  23.                else
  24.                        return cin.get();
  25.        }
  26. }

  27. int     main()
  28. {
  29.        function<int(int)> result = bind(plus<int>(), 0, _1);
  30.        function<int(int)> term = bind(multiplies<int>(), 1, _1);
  31.        while (!cin.eof())
  32.        {
  33.                int x = getInt();
  34.                switch (getOp())
  35.                {
  36.                case '+':
  37.                        result = bind(plus<int>(), result(term(x)), _1);
  38.                        term = bind(multiplies<int>(), 1, _1);
  39.                        break;
  40.                case '-':
  41.                        result = bind(minus<int>(), result(term(x)), _1);
  42.                        term = bind(multiplies<int>(), 1, _1);
  43.                        break;
  44.                case '*':
  45.                        term = bind(multiplies<int>(), term(x), _1);
  46.                        break;
  47.                case '/':
  48.                        term = bind(divides<int>(), term(x), _1);
  49.                        break;
  50.                default:
  51.                        result = bind(plus<int>(), result(term(x)), _1);
  52.                        break;
  53.                }
  54.        }
  55.        cout << result(0) << endl;
  56.        return 0;
  57. }
复制代码
回复

使用道具 举报

darksteel 2011-4-21 13:45:21 | 显示全部楼层
本楼: 👍   0% (0)
 
 
0% (0)   👎
全局: 👍   100% (32)
 
 
0% (0)    👎
刚才对负数的支持还有点问题,这次来个除了错误检查什么都支持的加强版,包括括号。
  1. #include <iostream>
  2. #include <cstdio>
  3. using namespace std;
  4. char c;
  5. char get()
  6. {
  7.         while((c=cin.get())==' ');
  8.         return c;
  9. }
  10. double num() {
  11.         double ret = 0;
  12.         int f = 1;
  13.         if((c=get())=='-') f = -1;
  14.         else cin.putback(c);
  15.         while(c=get()) {
  16.                 if(c >= '0' && c <= '9')
  17.                         ret = ret * 10 + c-'0';
  18.                 else break;
  19.         }
  20.         double dec = 0.1;
  21.         if(c=='.') {
  22.                 while(c=get()) {
  23.                         if(c >= '0' && c <= '9') {
  24.                                 ret += dec*(c-'0');
  25.                                 dec /= 10;
  26.                         }
  27.                         else break;
  28.                 }
  29.         }
  30.         return f*ret;
  31. }
  32. double calc_add();
  33. double calc_mul()
  34. {
  35.         double ret = 0;
  36.         c=get();
  37.         if(c=='(') {
  38.                 ret = calc_add();
  39.                 c=get();
  40.         } else {
  41.                 cin.putback(c);
  42.                 ret = num();
  43.         }
  44.         while(c=='*'||c=='/') {
  45.                 ret = c=='*'?ret*calc_mul():ret/calc_mul();
  46.         }
  47.         return ret;
  48. }
  49. double calc_add()
  50. {
  51.         double ret = calc_mul();
  52.         while(c=='+'||c=='-') {
  53.                 ret = c=='+'?ret+calc_mul():ret-calc_mul();
  54.         }
  55.         return ret;
  56. }
  57. int
  58. main() {
  59.         cout << calc_add() << endl;
  60.         return 0;
  61. }
复制代码
回复

使用道具 举报

darksteel 2011-4-21 14:01:00 | 显示全部楼层
本楼: 👍   0% (0)
 
 
0% (0)   👎
全局: 👍   100% (32)
 
 
0% (0)    👎
回复 5# vvnesaa
boost库?好帅气的写法!

   
回复

使用道具 举报

头像被屏蔽
 楼主| wwwyhx 2011-4-21 14:02:05 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

Etrnls 2011-4-21 14:02:43 | 显示全部楼层
本楼: 👍   0% (0)
 
 
0% (0)   👎
全局: 👍   100% (7)
 
 
0% (0)    👎
回复 7# darksteel

不用boost... 里面用到的东西比较新的编译器比如GCC4.5和VC2010都支持的。
回复

使用道具 举报

darksteel 2011-4-21 14:03:54 | 显示全部楼层
本楼: 👍   0% (0)
 
 
0% (0)   👎
全局: 👍   100% (32)
 
 
0% (0)    👎
回复 8# wwwyhx
最新版本里处理了空格,回车我是作为表达式的结束符的
回复

使用道具 举报

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

本版积分规则

隐私提醒:
■拉群请前往同学同事飞友|拉群结伴版块,其他版块拉群,帖子会被自动删除
■论坛不能删帖,为防止被骚扰甚至人肉,不要公开留微信等联系方式,请以论坛私信方式发送。
■特定版块可以超级匿名:https://tools.1point3acres.com/thread
■其他版块匿名方法:http://www.1point3acres.com/bbs/thread-405991-1-1.html

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