有爱,有技术,有你^_^)y
╱人◕‿‿◕人╲订下契约(注册新用户)

合作站点账号登陆

QQ登录

只需一步,快速开始

快捷导航
查看: 906|回复: 11
收起左侧

【绝对新手向】整数型五则运算方法和解说

[复制链接]

该用户从未签到

25

主题

59

好友

8779

积分

序章

积分
8779
发表于 2012-8-10 21:31:19 | 显示全部楼层 |阅读模式

╱人◕‿‿◕人╲定下契约

您需要 登录 才可以下载或查看,没有账号?╱人◕‿‿◕人╲订下契约(注册新用户)

x
先说一下,什么是五则运算,就是在 加减乘除 的基础上面 ,再加上 %,也就是余 【就是求余数啊喂!】

输入的是一条标准的运算式,比如:2*(3+4)*5

注意一下是包含括号的,还有先乘除後加減以及() 優先運算的計算規則

【P.S. %是和乘除一个等级的
          整数型 也就是说里面的任何运算都不可以出现非整数的数字,不然会是错误的哟亲  (好吧我是懒得改成浮点数的)】

以下就是程式的代码

[mw_shl_code=cpp,true]#include <cctype>
#include <iostream>
#include <sstream>
#include <string>
#include <stack>
#include <queue>
using namespace std;

int sti(string a)
{stringstream b;
int k;
b << a;
b >> k;
return k;
}
int isopr(char c)
{if (c=='+' || c=='/' || c=='%' || c=='-' || c=='*' )
{return 1;}
else
return 0;
}
int check(char c)
{if (c=='*' || c=='/' || c=='%')
{return 3;}
if (c=='+' || c=='-')
{return 2;}
else
return 0;
}
void caculate (string a)
{int i,m,n;
stack<int> Numstack;
for (i=0;i<a.length();i++)
{if (isdigit(a<i>))
  {string c;
                    while (isdigit(a<i>))
   {c+=a<i>;
    i++;}
    Numstack.push(sti(c));
}
if (isopr(a<i>))
{if (a<i>=='+')
  {m=Numstack.top();
   Numstack.pop();
   n=Numstack.top();
   Numstack.pop();
   Numstack.push(m+n);
}
if (a<i>=='-')
  {m=Numstack.top();
   Numstack.pop();
   n=Numstack.top();
   Numstack.pop();
   Numstack.push(n-m);
}
if (a<i>=='*')
  {m=Numstack.top();
   Numstack.pop();
   n=Numstack.top();
   Numstack.pop();
   Numstack.push(m*n);
}
if (a<i>=='/')
  {m=Numstack.top();
   Numstack.pop();
   n=Numstack.top();
   Numstack.pop();
   Numstack.push(n/m);
}
if (a<i>=='%')
  {m=Numstack.top();
   Numstack.pop();
   n=Numstack.top();
   Numstack.pop();
   Numstack.push(n%m);
}
}
}
cout << Numstack.top() << endl;
}
int main(){
stack<char> Oprstack;
string a,b;
int i;
while (getline(cin,a))
{
Oprstack.push('!');
for (i=0;i<a.length();i++)
{if(isdigit(a<i>))
  { while (isdigit(a<i>))
                    { b+=a<i>;
                    i++;}
                    b+=' ';
                    }
   if(a<i>=='(')
{Oprstack.push(a<i>);}
if (a<i>==')')
{while (Oprstack.top()!='(')
  {b+=Oprstack.top();
   b+=' ';
   Oprstack.pop();
}
Oprstack.pop();
}
  if(isopr(a<i>))
  {if (check(a<i>)>check(Oprstack.top()))
{Oprstack.push(a<i>);
}
else if (check(a<i>)<=check(Oprstack.top()))
{while (check(a<i>)<=check(Oprstack.top()))
{b+=Oprstack.top();
b+=' ';
Oprstack.pop();
}
Oprstack.push(a<i>);
}
}
  
}
while(Oprstack.top()!='!')
{b+=Oprstack.top();
b+=' ';
Oprstack.pop();}
caculate(b);
}
return 0;
}[/mw_shl_code]








评分

参与人数 1宅币 +10 贡献 +1 收起 理由
风音洛洛 + 10 + 1

查看全部评分

签名被小宅喵吞掉了~~~~(>_<)~~~~
回复

使用道具 举报

该用户从未签到

25

主题

59

好友

8779

积分

序章

积分
8779
 楼主| 发表于 2012-8-10 21:35:29 | 显示全部楼层
本帖最后由 terry182 于 2012-8-10 21:43 编辑

基本思路是这样的:首先把输入的算式转换成不需要括号的逆波兰表示式

詳情請看:http://zh.wikipedia.org/wiki/%E9%80%86%E6%B3%A2%E5%85%B0%E8%A1%A8%E7%A4%BA%E6%B3%95

然后再进行计算

转换的方法就是调度场算法:继续维基:http://zh.wikipedia.org/wiki/%E8%B0%83%E5%BA%A6%E5%9C%BA%E7%AE%97%E6%B3%95

计算的方法在逆波兰表示式的那个维基链接里有。。 【我是懒得说 被pia飞 】

评分

参与人数 1宅币 +10 收起 理由
风音洛洛 + 10 o(* ̄▽ ̄*)ブ 发糖

查看全部评分

签名被小宅喵吞掉了~~~~(>_<)~~~~
回复 支持 反对

使用道具 举报

该用户从未签到

25

主题

59

好友

8779

积分

序章

积分
8779
 楼主| 发表于 2012-8-10 21:36:21 | 显示全部楼层
签名被小宅喵吞掉了~~~~(>_<)~~~~
回复 支持 反对

使用道具 举报

该用户从未签到

258

主题

314

好友

3万

积分

第二章

积分
35715
发表于 2012-8-10 23:39:36 | 显示全部楼层
shunting yard algorithm原来中文叫调度场算法
博客什么的求人气 http://bimania.org
回复 支持 反对

使用道具 举报

该用户从未签到

25

主题

59

好友

8779

积分

序章

积分
8779
 楼主| 发表于 2012-8-10 23:40:56 | 显示全部楼层
签名被小宅喵吞掉了~~~~(>_<)~~~~
回复 支持 反对

使用道具 举报

该用户从未签到

258

主题

314

好友

3万

积分

第二章

积分
35715
发表于 2012-8-10 23:56:37 | 显示全部楼层
terry182 发表于 2012-8-10 23:40
是的 很有用呢

其实思想挺简单的,不过确实很有用
博客什么的求人气 http://bimania.org
回复 支持 反对

使用道具 举报

该用户从未签到

3

主题

18

好友

4932

积分

序章

积分
4932
发表于 2012-8-11 12:03:16 | 显示全部楼层

@ 我又不告诉我怎么弄这个代码格式,随便TX人不好哟少年!
有点眼花,要是每一段加点说明就好了
非常基础透彻的算法,适合演练。但是其实实用来说不用这么麻烦,我的方法是连数据库直接select 这个字符串算式 from dual  用orcale可行,大概连个excel也行的,excel功能强大,几乎所有电脑都会装
stringstream没用过,我用strtoint,加一个try,万一出错返回错误信息
继续求怎么弄这个代码格式啊
签名被小宅喵吞掉了~~~~(>_<)~~~~
回复 支持 反对

使用道具 举报

该用户从未签到

25

主题

59

好友

8779

积分

序章

积分
8779
 楼主| 发表于 2012-8-11 18:57:56 | 显示全部楼层
本帖最后由 terry182 于 2012-8-11 19:02 编辑
老实猫 发表于 2012-8-11 12:03
@ 我又不告诉我怎么弄这个代码格式,随便TX人不好哟少年!
有点眼花,要是每一段加点说明就好了
非常基础 ...

[mw_shl_code=cpp,true]#include<iostream>
using namespace std;
int main()          //你说的代码格式是这个么
{cout << "Hello World!" << endl;
system("pause");
return 0;
}[/mw_shl_code]
签名被小宅喵吞掉了~~~~(>_<)~~~~
回复 支持 反对

使用道具 举报

该用户从未签到

3

主题

18

好友

4932

积分

序章

积分
4932
发表于 2012-8-11 19:16:51 | 显示全部楼层
terry182 发表于 2012-8-11 18:57
[mw_shl_code=cpp,true]#include
using namespace std;
int main()          //你说的代码格式是这个么

是啊是啊,肿么弄的
签名被小宅喵吞掉了~~~~(>_<)~~~~
回复 支持 反对

使用道具 举报

该用户从未签到

25

主题

59

好友

8779

积分

序章

积分
8779
 楼主| 发表于 2012-8-11 19:19:53 | 显示全部楼层
老实猫 发表于 2012-8-11 19:16
是啊是啊,肿么弄的

回复那里那个  <> 的符号就是了
签名被小宅喵吞掉了~~~~(>_<)~~~~
回复 支持 反对

使用道具 举报

该用户从未签到

3

主题

18

好友

4932

积分

序章

积分
4932
发表于 2012-8-11 19:35:20 | 显示全部楼层
  1. wooooooow~~amazing~!
复制代码
签名被小宅喵吞掉了~~~~(>_<)~~~~
回复 支持 反对

使用道具 举报

该用户从未签到

25

主题

59

好友

8779

积分

序章

积分
8779
 楼主| 发表于 2012-8-11 19:42:58 | 显示全部楼层

别疯狂啊少年
签名被小宅喵吞掉了~~~~(>_<)~~~~
回复 支持 反对

使用道具 举报

本版积分规则

小黑屋|手机版|技术宅(基宅) ( 粤ICP备18082987号-1 | 浙公网安备 33010902001746号 )

GMT+8, 2024-6-10 16:13 , Processed in 0.208325 second(s), 20 queries , Redis On.

Copyright © 2018 技术宅社区

Powered by Discuz! X3.5

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