鱼C论坛

 找回密码
 立即注册
查看: 2299|回复: 37

[已解决]梦想护卫舰 第34期 递增运算【原创】

[复制链接]
发表于 2023-4-1 12:35:45 | 显示全部楼层 |阅读模式
10鱼币
本帖最后由 元豪 于 2023-5-7 17:02 编辑

梦想护卫舰 第34期 递等运算


梦想护卫舰终于继续出发

这时,高山发现,船上的很多人竟然不会递等运算!!!这可不行,所以他来拜托你帮忙教学一下。


                               
登录/注册后可看大图


题目描述

给定一个混合算式,输出递等运算的过程。

先乘除后加减。

举一个例子:

  1. 3+10*10-15/3
  2. =3+100-15/3
  3. =3+100-5
  4. =103-5
  5. =98
复制代码

除法向下取整。


                               
登录/注册后可看大图


输入格式

输入 1 行,1 个混合算式。


                               
登录/注册后可看大图


输出格式

输出所有的过程。

注意!第一行要输出原算式,前面要输出 1 个空格。


                               
登录/注册后可看大图


输入输出样例

输入 #1

  1. 3+10*10-15/3
复制代码


输出 #1

  1. 3+10*10-15/3
  2. =3+100-15/3
  3. =3+100-5
  4. =103-5
  5. =98
复制代码


输入 #2

  1. 1+1+5+5+6+9+7
复制代码


输出 #2

  1. 1+1+5+5+6+9+7
  2. =2+5+5+6+9+7
  3. =7+5+6+9+7
  4. =12+6+9+7
  5. =18+9+7
  6. =27+7
  7. =34
复制代码


输入 #3

  1. 10+10*10*10/100
复制代码


输出 #3

  1. 10+10*10*10/100
  2. =10+100*10/100
  3. =10+1000/100
  4. =10+10
  5. =20
复制代码



                               
登录/注册后可看大图


数据范围

对于 100% 的数据,保证算式中数字个数 2 <= N <= 1000 且单个数字 1 <= N_i <= 10^9 。

注:本题原创,链接:https://www.luogu.com.cn/problem/T326736

图一时之快先看答案,你将失去一次锻炼的机会!


                               
登录/注册后可看大图


答案与解析

游客,如果您要查看本帖隐藏内容请回复


最佳答案
2023-4-1 12:35:46
听说这里有鱼币可以领:
  1. #include <bits/stdc++.h>
  2. using namespace std;

  3. char s[20001], chr[1003];
  4. __int128 num[1004], imposs = 1145141919810;
  5. long long n, nums, chrs, rn;

  6. void output(__int128 n) {
  7.         if (n < 0) {
  8.                 n = labs(n);
  9.                 printf("-");
  10.         }
  11.         if (n == 0) printf("0");
  12.         else {
  13.                 char ans[40];
  14.                 int t = 0;
  15.                 while (n) {
  16.                         ans[++t] = n % 10 + '0';
  17.                         n /= 10;
  18.                 }
  19.                 for (int i = t; i >= 1; --i) {
  20.                         printf("%c", ans[i]);
  21.                 }
  22.         }
  23. }

  24. void output() {
  25.         printf("=");
  26.         int tot = 0, chtot = 0;
  27.         for (int i = 1; i <= nums; ++i) {
  28.                 if (num[i] != imposs) num[++tot] = num[i];
  29.         }
  30.         for (int i = 1; i <= chrs; ++i) {
  31.                 if (chr[i] != 0) chr[++chtot] = chr[i];
  32.         }
  33.         chrs = chtot;
  34.         nums = tot;
  35.         for (int i = 1; i <= nums; ++i) {
  36.                 output(num[i]);
  37.                 if (i != nums) {
  38.                         printf("%c", chr[i]);
  39.                 }
  40.         }
  41.         printf("\n");
  42. }

  43. int main() {
  44.         scanf("%s", s + 1);
  45.         n = strlen(s + 1);
  46.         __int128 t = 0;
  47.         for (int i = 1; i <= n; ++i) {
  48.                 if (s[i] >= '0' && s[i] <= '9') {
  49.                         t = t * 10 + (s[i] - '0');
  50.                 } else {
  51.                         num[++nums] = (__int128)t;
  52.                         chr[++chrs] = s[i];
  53.                         t = 0;
  54.                 }
  55.         }
  56.         num[++nums] = (__int128)t;
  57.         printf(" %s\n", s + 1);
  58.         while (nums != 1) {
  59.                 int pos = 1;
  60.                 for (int i = 1; i <= chrs; ++i) {
  61.                         if (chr[i] == '*' || chr[i] == '/') {
  62.                                 pos = i;
  63.                                 break;
  64.                         }
  65.                 }
  66.                 __int128 lv = num[pos], rv = num[pos + 1];
  67.                 num[pos + 1] = imposs;
  68.                 switch (chr[pos]) {
  69.                         case '+':
  70.                                 num[pos] = lv + rv;
  71.                                 break;
  72.                         case '-':
  73.                                 num[pos] = lv - rv;
  74.                                 break;
  75.                         case '*':
  76.                                 num[pos] = lv * rv;
  77.                                 break;
  78.                         case '/':
  79.                                 num[pos] = lv / rv;
  80.                                 break;
  81.                         default:
  82.                                 exit(1);
  83.                 }
  84.                 chr[pos] = 0;
  85.                 output();
  86.         }
  87. }
复制代码

最佳答案

查看完整内容

听说这里有鱼币可以领:

评分

参与人数 2荣誉 +3 鱼币 +1 收起 理由
myd0313 + 1 + 1 鱼C有你更精彩^_^
zhangjinxuan + 2 感谢楼主无私奉献!

查看全部评分

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-4-1 12:35:46 | 显示全部楼层    本楼为最佳答案   
听说这里有鱼币可以领:
  1. #include <bits/stdc++.h>
  2. using namespace std;

  3. char s[20001], chr[1003];
  4. __int128 num[1004], imposs = 1145141919810;
  5. long long n, nums, chrs, rn;

  6. void output(__int128 n) {
  7.         if (n < 0) {
  8.                 n = labs(n);
  9.                 printf("-");
  10.         }
  11.         if (n == 0) printf("0");
  12.         else {
  13.                 char ans[40];
  14.                 int t = 0;
  15.                 while (n) {
  16.                         ans[++t] = n % 10 + '0';
  17.                         n /= 10;
  18.                 }
  19.                 for (int i = t; i >= 1; --i) {
  20.                         printf("%c", ans[i]);
  21.                 }
  22.         }
  23. }

  24. void output() {
  25.         printf("=");
  26.         int tot = 0, chtot = 0;
  27.         for (int i = 1; i <= nums; ++i) {
  28.                 if (num[i] != imposs) num[++tot] = num[i];
  29.         }
  30.         for (int i = 1; i <= chrs; ++i) {
  31.                 if (chr[i] != 0) chr[++chtot] = chr[i];
  32.         }
  33.         chrs = chtot;
  34.         nums = tot;
  35.         for (int i = 1; i <= nums; ++i) {
  36.                 output(num[i]);
  37.                 if (i != nums) {
  38.                         printf("%c", chr[i]);
  39.                 }
  40.         }
  41.         printf("\n");
  42. }

  43. int main() {
  44.         scanf("%s", s + 1);
  45.         n = strlen(s + 1);
  46.         __int128 t = 0;
  47.         for (int i = 1; i <= n; ++i) {
  48.                 if (s[i] >= '0' && s[i] <= '9') {
  49.                         t = t * 10 + (s[i] - '0');
  50.                 } else {
  51.                         num[++nums] = (__int128)t;
  52.                         chr[++chrs] = s[i];
  53.                         t = 0;
  54.                 }
  55.         }
  56.         num[++nums] = (__int128)t;
  57.         printf(" %s\n", s + 1);
  58.         while (nums != 1) {
  59.                 int pos = 1;
  60.                 for (int i = 1; i <= chrs; ++i) {
  61.                         if (chr[i] == '*' || chr[i] == '/') {
  62.                                 pos = i;
  63.                                 break;
  64.                         }
  65.                 }
  66.                 __int128 lv = num[pos], rv = num[pos + 1];
  67.                 num[pos + 1] = imposs;
  68.                 switch (chr[pos]) {
  69.                         case '+':
  70.                                 num[pos] = lv + rv;
  71.                                 break;
  72.                         case '-':
  73.                                 num[pos] = lv - rv;
  74.                                 break;
  75.                         case '*':
  76.                                 num[pos] = lv * rv;
  77.                                 break;
  78.                         case '/':
  79.                                 num[pos] = lv / rv;
  80.                                 break;
  81.                         default:
  82.                                 exit(1);
  83.                 }
  84.                 chr[pos] = 0;
  85.                 output();
  86.         }
  87. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2023-4-1 12:40:35 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2023-4-1 12:44:04 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-4-1 12:44:11 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2023-4-1 12:45:11 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-4-1 12:46:53 | 显示全部楼层
本帖最后由 zhangjinxuan 于 2023-4-1 12:51 编辑

我们要向他人虚心请教,做一个不耻下问的好学生,这样我们的水平才会有所提高

说亮话,我不会,我真搞不懂哪里出了问题
  1. #include <bits/stdc++.h>
  2. import sys

  3. s = str() #整个表达式
  4. char = [] #运算符
  5. num = [] #数字
  6. n = int() #字符串的长度
  7. nums = int(-1) #数字的个数
  8. chrs = int(-1) #运算符的个数
  9. impossible_number = 11451419198105201314100863141592699897894123784923 #当一个数字消除了的时候,把他设为这个数字,后面再做处理

  10. def output() -> None: #输出
  11.     global num, nums, char, chrs
  12.     print('=', end = '')
  13.     tot = chtot = -1
  14.     for i in range(0, nums + 1): #去掉消除了的数字
  15.         if num[i] != impossible_number:
  16.             tot += 1
  17.             num[tot] = num[i]
  18.     for i in range(0, chrs + 1): #运算符同理
  19.         if char[i] != '.':
  20.             chtot += 1
  21.             char[chtot] = char[i]
  22.     nums = tot
  23.     chrs = chtot
  24.     for i in range(0, nums + 1): #输出
  25.         print(num[i], end = '')
  26.         if i != nums:
  27.             print(char[i], end = '')
  28.     print()

  29. def main() -> int: #主函数
  30.     global nums, chrs, num, char, impossible_number
  31.     s = input().strip()
  32.    
  33.     n = len(s)
  34.     t = int()
  35.     for i in range(n):
  36.         if s[i].isdigit(): #获取数字
  37.             t = t * 10 + int(s[i])
  38.         else: #运算符,说明数字结束
  39.             nums += 1
  40.             chrs += 1
  41.             num += [t]
  42.             char += [s[i]]
  43.             t = 0
  44.     nums += 1 #还有一个数字没有添加
  45.     num += [t]
  46.     print(" %s" % s)
  47.     while nums != 0: #还有数字
  48.         pos = int(0)
  49.         for i in range(0, chrs + 1): #获取第一个乘,除号
  50.             if char[i] == '*' or char[i] == '/':
  51.                 pos = i
  52.                 break
  53.         lv = num[pos] #获取运算符两边数字
  54.         rv = num[pos + 1]
  55.         num[pos + 1] = impossible_number
  56.         if char[pos] == '+': #运算
  57.             num[pos] = lv + rv
  58.         elif char[pos] == '-':
  59.             num[pos] = lv - rv
  60.         elif char[pos] == '*':
  61.             num[pos] = lv * rv
  62.         elif char[pos] == '/':
  63.             num[pos] = lv // rv
  64.         else:
  65.             pass
  66.         char[pos] = '.' #要消除的运算符标记
  67.         output()
  68.     tmp = eval(s.replace('/', '//')) #一个验证,看看结果对不对
  69.     if tmp == num[pos]:
  70.         return 0
  71.     else:
  72.         return 1
  73.     return 0

  74. if __name__ == '__main__':
  75.     sys.exit(main())
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2023-4-1 12:51:15 | 显示全部楼层
zhangjinxuan 发表于 2023-4-1 12:46
我们要向他人虚心请教,做一个不耻下问的好学生,这样我们的水平才会有所提高{:10_256 ...

我估计没有问题 , 只是效率差点意思
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-4-1 12:51:48 | 显示全部楼层
不好意思,我是WA,不是Tle:
https://www.luogu.com.cn/record/106596730
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2023-4-1 12:54:22 | 显示全部楼层
zhangjinxuan 发表于 2023-4-1 12:51
不好意思,我是WA,不是Tle:
https://www.luogu.com.cn/record/106596730

啊这 , 不会是标程有问题吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-4-1 12:57:59 | 显示全部楼层
元豪 发表于 2023-4-1 12:54
啊这 , 不会是标程有问题吧

20%是标程问题,30% 是环境差异问题,50%是我的问题
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2023-4-1 12:58:41 | 显示全部楼层
zhangjinxuan 发表于 2023-4-1 12:57
20%是标程问题,30% 是环境差异问题,50%是我的问题

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-4-1 12:59:06 | 显示全部楼层
是时候拿出我的祖传找茬,啊呸,hack技术了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2023-4-1 12:59:57 | 显示全部楼层
zhangjinxuan 发表于 2023-4-1 12:59
是时候拿出我的祖传找茬,啊呸,hack技术了

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-4-1 15:03:28 | 显示全部楼层
本帖最后由 歌者文明清理员 于 2023-4-1 15:04 编辑

这是真的难
  1. yunsuan = eval
复制代码
可以省事
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-4-1 22:29:09 From FishC Mobile | 显示全部楼层
叫你用梦想护卫舰的背景呢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2023-4-2 07:28:15 | 显示全部楼层
高山 发表于 2023-4-1 22:29
叫你用梦想护卫舰的背景呢

啊对 ! 我改改啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-4-2 11:03:01 | 显示全部楼层
题目错了,是递等不是递增
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2023-4-2 11:21:33 | 显示全部楼层
歌者文明清理员 发表于 2023-4-2 11:03
题目错了,是递等不是递增

啊这......谢谢提醒
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-4-2 11:23:37 | 显示全部楼层
元豪 发表于 2023-4-2 11:21
啊这......谢谢提醒

主题的题目也没改
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-3-29 21:55

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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