元豪 发表于 2023-4-1 12:35:45

梦想护卫舰 第34期 递增运算【原创】

本帖最后由 元豪 于 2023-5-7 17:02 编辑

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

梦想护卫舰终于继续出发

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

static/image/hrline/1.gif

题目描述

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

先乘除后加减。

举一个例子:

3+10*10-15/3
=3+100-15/3
=3+100-5
=103-5
=98
除法向下取整。

static/image/hrline/1.gif

输入格式

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

static/image/hrline/1.gif

输出格式

输出所有的过程。

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

static/image/hrline/1.gif

输入输出样例

输入 #1

3+10*10-15/3

输出 #1

3+10*10-15/3
=3+100-15/3
=3+100-5
=103-5
=98

输入 #2

1+1+5+5+6+9+7

输出 #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

10+10*10*10/100

输出 #3

10+10*10*10/100
=10+100*10/100
=10+1000/100
=10+10
=20

static/image/hrline/1.gif

数据范围

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

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

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

static/image/hrline/1.gif

答案与解析

**** Hidden Message *****

zhangjinxuan 发表于 2023-4-1 12:35:46

听说这里有鱼币可以领:
#include <bits/stdc++.h>
using namespace std;

char s, chr;
__int128 num, 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;
                int t = 0;
                while (n) {
                        ans[++t] = n % 10 + '0';
                        n /= 10;
                }
                for (int i = t; i >= 1; --i) {
                        printf("%c", ans);
                }
        }
}

void output() {
        printf("=");
        int tot = 0, chtot = 0;
        for (int i = 1; i <= nums; ++i) {
                if (num != imposs) num[++tot] = num;
        }
        for (int i = 1; i <= chrs; ++i) {
                if (chr != 0) chr[++chtot] = chr;
        }
        chrs = chtot;
        nums = tot;
        for (int i = 1; i <= nums; ++i) {
                output(num);
                if (i != nums) {
                        printf("%c", chr);
                }
        }
        printf("\n");
}

int main() {
        scanf("%s", s + 1);
        n = strlen(s + 1);
        __int128 t = 0;
        for (int i = 1; i <= n; ++i) {
                if (s >= '0' && s <= '9') {
                        t = t * 10 + (s - '0');
                } else {
                        num[++nums] = (__int128)t;
                        chr[++chrs] = s;
                        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 == '*' || chr == '/') {
                                pos = i;
                                break;
                        }
                }
                __int128 lv = num, rv = num;
                num = imposs;
                switch (chr) {
                        case '+':
                                num = lv + rv;
                                break;
                        case '-':
                                num = lv - rv;
                                break;
                        case '*':
                                num = lv * rv;
                                break;
                        case '/':
                                num = lv / rv;
                                break;
                        default:
                                exit(1);
                }
                chr = 0;
                output();
        }
}

元豪 发表于 2023-4-1 12:40:35

@zhangjinxuan @高山 @sfqxx @ExiaGN001

元豪 发表于 2023-4-1 12:44:04

{:10_254:}{:10_254:}

zhangjinxuan 发表于 2023-4-1 12:44:11

{:10_266:}

元豪 发表于 2023-4-1 12:45:11

zhangjinxuan 发表于 2023-4-1 12:44


{:10_245:}

zhangjinxuan 发表于 2023-4-1 12:46:53

本帖最后由 zhangjinxuan 于 2023-4-1 12:51 编辑

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

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

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

def output() -> None: #输出
    global num, nums, char, chrs
    print('=', end = '')
    tot = chtot = -1
    for i in range(0, nums + 1): #去掉消除了的数字
      if num != impossible_number:
            tot += 1
            num = num
    for i in range(0, chrs + 1): #运算符同理
      if char != '.':
            chtot += 1
            char = char
    nums = tot
    chrs = chtot
    for i in range(0, nums + 1): #输出
      print(num, end = '')
      if i != nums:
            print(char, end = '')
    print()

def main() -> int: #主函数
    global nums, chrs, num, char, impossible_number
    s = input().strip()
   
    n = len(s)
    t = int()
    for i in range(n):
      if s.isdigit(): #获取数字
            t = t * 10 + int(s)
      else: #运算符,说明数字结束
            nums += 1
            chrs += 1
            num +=
            char += ]
            t = 0
    nums += 1 #还有一个数字没有添加
    num +=
    print(" %s" % s)
    while nums != 0: #还有数字
      pos = int(0)
      for i in range(0, chrs + 1): #获取第一个乘,除号
            if char == '*' or char == '/':
                pos = i
                break
      lv = num #获取运算符两边数字
      rv = num
      num = impossible_number
      if char == '+': #运算
            num = lv + rv
      elif char == '-':
            num = lv - rv
      elif char == '*':
            num = lv * rv
      elif char == '/':
            num = lv // rv
      else:
            pass
      char = '.' #要消除的运算符标记
      output()
    tmp = eval(s.replace('/', '//')) #一个验证,看看结果对不对
    if tmp == num:
      return 0
    else:
      return 1
    return 0

if __name__ == '__main__':
    sys.exit(main())

元豪 发表于 2023-4-1 12:51:15

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

我估计没有问题 , 只是效率差点意思{:10_256:}

zhangjinxuan 发表于 2023-4-1 12:51:48

不好意思,我是WA,不是Tle:
https://www.luogu.com.cn/record/106596730

元豪 发表于 2023-4-1 12:54:22

zhangjinxuan 发表于 2023-4-1 12:51
不好意思,我是WA,不是Tle:
https://www.luogu.com.cn/record/106596730

啊这 , 不会是标程有问题吧{:10_245:}

zhangjinxuan 发表于 2023-4-1 12:57:59

元豪 发表于 2023-4-1 12:54
啊这 , 不会是标程有问题吧

20%是标程问题,30% 是环境差异问题,50%是我的问题{:10_250:}

元豪 发表于 2023-4-1 12:58:41

zhangjinxuan 发表于 2023-4-1 12:57
20%是标程问题,30% 是环境差异问题,50%是我的问题

{:10_256:}

zhangjinxuan 发表于 2023-4-1 12:59:06

是时候拿出我的祖传找茬{:10_277:},啊呸{:10_306:},hack技术了{:10_279:}

元豪 发表于 2023-4-1 12:59:57

zhangjinxuan 发表于 2023-4-1 12:59
是时候拿出我的祖传找茬,啊呸,hack技术了

{:10_334:}

歌者文明清理员 发表于 2023-4-1 15:03:28

本帖最后由 歌者文明清理员 于 2023-4-1 15:04 编辑

这是真的难
yunsuan = eval可以省事

高山 发表于 2023-4-1 22:29:09

叫你用梦想护卫舰的背景呢

元豪 发表于 2023-4-2 07:28:15

高山 发表于 2023-4-1 22:29
叫你用梦想护卫舰的背景呢

啊对 ! {:10_257:}我改改啊

歌者文明清理员 发表于 2023-4-2 11:03:01

题目错了,是递等不是递增

元豪 发表于 2023-4-2 11:21:33

歌者文明清理员 发表于 2023-4-2 11:03
题目错了,是递等不是递增

啊这......谢谢提醒{:10_277:}

歌者文明清理员 发表于 2023-4-2 11:23:37

元豪 发表于 2023-4-2 11:21
啊这......谢谢提醒

主题的题目也没改
页: [1] 2
查看完整版本: 梦想护卫舰 第34期 递增运算【原创】