【天梯 - Wikioi】2235 机票打折

本文介绍了一种计算打折后机票价格的算法,通过输入机票原价和打折率,程序能够准确计算出最终的价格,并将结果四舍五入到十位数。包括输入输出描述、正确程序代码和心得分享。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

.输入机票原价(3到4位的正整数,单位:元),再输入机票打折率(小数点后最多一位数字)。编程计算打折后机票的实际价格(单位:元。计算结果要将个位数四舍五入到十位数“元”)。输入只有一行两个数(两数间用一个空格分隔),第一个为整数,表示机票原价,第二个整数或实数(如是实数,小数点后最多1位数字)表示打折率。

输入样例1:

888  7

输出样例1:

620

输入样例2:

1255  7 

输出样例2:

 880

输入只有一行两个数(两数间用一个空格分隔),第一个为整数,表示机票原价,第二个整数或实数(如是实数,小数点后最多1位数字)表示打折率。

输出只有一行一个正整数,表示打折后的机票价格。

888 7

620

原机票价格大于100小于9999,打折率大于1小于9.9。

### 天梯赛 L2-1 简单计算器解析 #### 题目描述 该题目要求实现一个基于堆栈的简单计算器。给定一系列的操作数和运算符,按照特定规则进行计算并返回最终结果。 #### 输入输出格式说明 输入包含多组测试数据,每组的第一行为整数N表示后续有N个操作项(可以是数字或运算符),之后依次给出这些操作项。当遇到除法时,若分母为0则应立即停止处理并输出错误提示信息。 #### 设计思路 为了完成此任务,采用双栈结构来分别存储数值(S1)与算术符号(S2),具体流程如下: 每当读取到一个新的素时: - 如果它是数字,则将其压入S1; - 若为加减乘除四类基本二运算符之一,则先检查当前待处理表达式的合法性再决定如何动作——即确保有足够的操作数可用作此次运算之需。 一旦接收到终止信号(例如等号)=,便开始逐一取出顶部两份材料配合最近一次记录下的指令做相应变换直到整个序列被完全消耗掉为止[^2]。 对于异常情况特别注意的是,在执行除法的过程中要检测是否存在除以零的情况,如果有这样的情形发生应当即时反馈错误消息而不是继续尝试其他任何可能引起崩溃的行为[^3]。 #### C++代码示例 下面是依据上述逻辑编写的C++版本解决方案: ```cpp #include <iostream> #include <stack> using namespace std; bool divideByZero = false; double calculate(double a, char op, double b){ switch(op){ case &#39;+&#39;: return a+b; case &#39;-&#39;: return a-b; case &#39;*&#39;: return a*b; case &#39;/&#39;: if(b == 0){ divideByZero = true; return 0; // 这里只是形式上的返回值,实际不会用到 } else return a/b; } } int main(){ stack<double> numStack; stack<char> operStack; int n; cin >> n; for(int i=0 ;i<n ;i++){ string s; cin>>s; try{ // 尝试转换字符串为数字 double d = stod(s); numStack.push(d); }catch(invalid_argument& e){ // 当无法成功转成数字时,默认认为其是一个有效的运算符 while(!operStack.empty()){ auto topOper = operStack.top(); // 只对非左括号的运算符进行计算 if(topOper != &#39;(&#39; && !divideByZero){ double secondNum = numStack.top();numStack.pop(); double firstNum = numStack.top();numStack.pop(); double res = calculate(firstNum,topOper,secondNum); numStack.push(res); operStack.pop(); }else break; } if(divideByZero || s=="="){ throw "end"; } operStack.push(s[0]); } } catch(const char* msg){ if(msg == "end"){ if(numStack.size()==1&&!divideByZero){ printf("%.lf\n",numStack.top()); }else if(divideByZero){ cout << "ERROR: "<< numStack.top()<<"/0"<< endl; } } } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值