鱼C论坛

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

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

[复制链接]
发表于 2023-4-1 12:35:45 | 显示全部楼层 |阅读模式
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
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


                               
登录/注册后可看大图


数据范围

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

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

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


                               
登录/注册后可看大图


答案与解析

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


最佳答案
2023-4-1 12:35:46
听说这里有鱼币可以领:
#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();
        }
}

最佳答案

查看完整内容

听说这里有鱼币可以领:

评分

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

查看全部评分

本帖被以下淘专辑推荐:

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

使用道具 举报

发表于 2023-4-1 12:35:46 | 显示全部楼层    本楼为最佳答案   
听说这里有鱼币可以领:
#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();
        }
}
想知道小甲鱼最近在做啥?请访问 -> 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 编辑

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

说亮话,我不会,我真搞不懂哪里出了问题
#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[i] != impossible_number:
            tot += 1
            num[tot] = num[i]
    for i in range(0, chrs + 1): #运算符同理
        if char[i] != '.':
            chtot += 1
            char[chtot] = char[i]
    nums = tot
    chrs = chtot
    for i in range(0, nums + 1): #输出
        print(num[i], end = '')
        if i != nums:
            print(char[i], 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[i].isdigit(): #获取数字
            t = t * 10 + int(s[i])
        else: #运算符,说明数字结束
            nums += 1
            chrs += 1
            num += [t]
            char += [s[i]]
            t = 0
    nums += 1 #还有一个数字没有添加
    num += [t]
    print(" %s" % s)
    while nums != 0: #还有数字
        pos = int(0)
        for i in range(0, chrs + 1): #获取第一个乘,除号
            if char[i] == '*' or char[i] == '/':
                pos = i
                break
        lv = num[pos] #获取运算符两边数字
        rv = num[pos + 1]
        num[pos + 1] = impossible_number
        if char[pos] == '+': #运算
            num[pos] = lv + rv
        elif char[pos] == '-':
            num[pos] = lv - rv
        elif char[pos] == '*':
            num[pos] = lv * rv
        elif char[pos] == '/':
            num[pos] = lv // rv
        else:
            pass
        char[pos] = '.' #要消除的运算符标记
        output()
    tmp = eval(s.replace('/', '//')) #一个验证,看看结果对不对
    if tmp == num[pos]:
        return 0
    else:
        return 1
    return 0

if __name__ == '__main__':
    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 编辑

这是真的难
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-11-22 05:21

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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