|
10鱼币
本帖最后由 元豪 于 2023-5-7 17:02 编辑
梦想护卫舰 第34期 递等运算
梦想护卫舰终于继续出发
这时,高山发现,船上的很多人竟然不会递等运算!!!这可不行,所以他来拜托你帮忙教学一下。
题目描述
给定一个混合算式,输出递等运算的过程。
先乘除后加减。
举一个例子:
- 3+10*10-15/3
- =3+100-15/3
- =3+100-5
- =103-5
- =98
复制代码
除法向下取整。
输入格式
输入 1 行,1 个混合算式。
输出格式
输出所有的过程。
注意!第一行要输出原算式,前面要输出 1 个空格。
输入输出样例
输入 #1
输出 #1
- 3+10*10-15/3
- =3+100-15/3
- =3+100-5
- =103-5
- =98
复制代码
输入 #2
输出 #2
- 1+1+5+5+6+9+7
- =2+5+5+6+9+7
- =7+5+6+9+7
- =12+6+9+7
- =18+9+7
- =27+7
- =34
复制代码
输入 #3
输出 #3
- 10+10*10*10/100
- =10+100*10/100
- =10+1000/100
- =10+10
- =20
复制代码
数据范围
对于 100% 的数据,保证算式中数字个数 2 <= N <= 1000 且单个数字 1 <= N_i <= 10^9 。
注:本题原创,链接:https://www.luogu.com.cn/problem/T326736
图一时之快先看答案,你将失去一次锻炼的机会!
答案与解析
听说这里有鱼币可以领:
- #include <bits/stdc++.h>
- using namespace std;
- char s[20001], chr[1003];
- __int128 num[1004], imposs = 1145141919810;
- long long n, nums, chrs, rn;
- void output(__int128 n) {
- if (n < 0) {
- n = labs(n);
- printf("-");
- }
- if (n == 0) printf("0");
- else {
- char ans[40];
- int t = 0;
- while (n) {
- ans[++t] = n % 10 + '0';
- n /= 10;
- }
- for (int i = t; i >= 1; --i) {
- printf("%c", ans[i]);
- }
- }
- }
- void output() {
- printf("=");
- int tot = 0, chtot = 0;
- for (int i = 1; i <= nums; ++i) {
- if (num[i] != imposs) num[++tot] = num[i];
- }
- for (int i = 1; i <= chrs; ++i) {
- if (chr[i] != 0) chr[++chtot] = chr[i];
- }
- chrs = chtot;
- nums = tot;
- for (int i = 1; i <= nums; ++i) {
- output(num[i]);
- if (i != nums) {
- printf("%c", chr[i]);
- }
- }
- printf("\n");
- }
- int main() {
- scanf("%s", s + 1);
- n = strlen(s + 1);
- __int128 t = 0;
- for (int i = 1; i <= n; ++i) {
- if (s[i] >= '0' && s[i] <= '9') {
- t = t * 10 + (s[i] - '0');
- } else {
- num[++nums] = (__int128)t;
- chr[++chrs] = s[i];
- t = 0;
- }
- }
- num[++nums] = (__int128)t;
- printf(" %s\n", s + 1);
- while (nums != 1) {
- int pos = 1;
- for (int i = 1; i <= chrs; ++i) {
- if (chr[i] == '*' || chr[i] == '/') {
- pos = i;
- break;
- }
- }
- __int128 lv = num[pos], rv = num[pos + 1];
- num[pos + 1] = imposs;
- switch (chr[pos]) {
- case '+':
- num[pos] = lv + rv;
- break;
- case '-':
- num[pos] = lv - rv;
- break;
- case '*':
- num[pos] = lv * rv;
- break;
- case '/':
- num[pos] = lv / rv;
- break;
- default:
- exit(1);
- }
- chr[pos] = 0;
- output();
- }
- }
复制代码
|
评分
-
查看全部评分
|