蓝桥杯第17135题 不完整的算式 C++ Java Python

news2024/11/16 18:05:02

目录

题目

思路和解题方法

步骤 1:识别缺失的部分

步骤 2:根据已知条件计算或推断

步骤 3:处理特殊情况和验证

c++ 代码

Java 版本

Python 版本(仅供参考)

代码和解题细节:


题目

题目链接:https://www.lanqiao.cn/problems/17135/learning/

思路和解题方法

步骤 1:识别缺失的部分

首先,需要确定算式中哪一部分被擦掉了。通过遍历输入的字符串,我们可以很容易地识别出AopBC中哪个位置被替换成了?

步骤 2:根据已知条件计算或推断

一旦确定了缺失的部分,就可以根据算式的其他部分进行计算或推断。

  • 如果缺失的是 C
    • 我们可以直接计算 A op B 的结果。这需要根据 op 的类型进行相应的运算。
  • 如果缺失的是 A 或 B
    • 我们可以将等式重写为 A = C / B(如果 op 是 / 且 B ≠ 0)或者 A = C - B(如果 op 是 -)、A = C + B(如果 op 是 +)、A = C * B(如果 op 是 *),然后计算出缺失的值。
  • 如果缺失的是 op
    • 我们需要根据 A 和 B 计算出可能的操作符,使得 A op B = C 成立。可以通过尝试所有操作符并检查哪个能得出正确的 C 值来实现。

步骤 3:处理特殊情况和验证

  • 在执行除法时,需要注意分母不能为零的情况。
  • 确保计算的结果符合题目要求的非负整数条件。
  • 检查是否有唯一解,因为题目保证了有唯一解,如果有多个可能的答案,则说明可能存在误解或计算错误。

c++ 代码

#include <iostream>
#include <string>
using namespace std;

// 将字符串s中从l到r的子串转换为整数
int calc(int l, int r, string s) {
    int res = 0;
    for (int i = l; i <= r; i++) {
        // 将字符数字转换为其对应的整数值并累加
        res = res * 10 + (s[i] - '0');
    }
    return res;
}

int main() {
    string s;
    cin >> s; // 读取输入的算式字符串

    int idx = s.find('?'); // 找到问号的位置
    int idx1 = s.find('='); // 找到等号的位置

    // 根据问号的位置执行不同的逻辑
    if (idx == 0) { // 如果问号在最前面(缺失A)
        char c = s[idx + 1]; // 获取运算符
        int a = calc(idx + 2, idx1 - 1, s); // 计算B的值
        int b = calc(idx1 + 1, s.length() - 1, s); // 计算C的值
        // 根据运算符计算缺失的A
        if (c == '+') cout << b - a << endl;
        else if (c == '-') cout << b + a << endl;
        else if (c == '*') cout << b / a << endl;
        else cout << b * a << endl;
    } else if (idx == s.length() - 1) { // 如果问号在最后面(缺失C)
        int idxA = s.find('+'), idxB = s.find('-'), idxC = s.find('*'), idxD = s.find('/'); // 查找运算符位置
        // 根据找到的运算符计算C
        if (idxA != -1) cout << calc(0, idxA - 1, s) + calc(idxA + 1, idx1 - 1, s) << endl;
        else if (idxB != -1) cout << calc(0, idxB - 1, s) - calc(idxB + 1, idx1 - 1, s) << endl;
        else if (idxC != -1) cout << calc(0, idxC - 1, s) * calc(idxC + 1, idx1 - 1, s) << endl;
        else cout << calc(0, idxD - 1, s) / calc(idxD + 1, idx1 - 1, s) << endl;
    } else if (idx == idx1 - 1) { // 如果问号在等号前(缺失B)
        char c = s[idx - 1]; // 获取运算符
        int a = calc(0, idx - 2, s); // 计算A的值
        int b = calc(idx1 + 1, s.length() - 1, s); // 计算C的值
        // 根据运算符计算缺失的B
        if (c == '+') cout << b - a << endl;
        else if (c == '-') cout << a - b << endl;
        else if (c == '*') cout << b / a << endl;
        else cout << a / b << endl;
    } else { // 如果问号是运算符(缺失op)
        int a = calc(0, idx - 1, s); // 计算A的值
        int b = calc(idx + 1, idx1 - 1, s); // 计算B的值
        int c = calc(idx1 + 1, s.length() - 1, s); // 计算C的值
        // 通过尝试加减乘除来确定正确的运算符
        if (a + b == c) cout << '+' << endl;
        else if (a - b == c) cout << '-' << endl;
        else if (a * b == c) cout << '*' << endl;
        else cout << '/' << endl;
    }

    return 0;
}

Java 版本

import java.util.Scanner;

public class Main {
    // 方法:将字符串s中从索引l到r的子串转换为整数
    static int calc(int l, int r, String s) {
        int res = 0;
        for (int i = l; i <= r; i++) {
            // 将字符转换为数字并累加到结果中
            res = res * 10 + (s.charAt(i) - '0');
        }
        return res;
    }

    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        String s = in.next(); // 读取输入的字符串表达式

        int idx = s.indexOf('?'); // 找到问号的位置
        int idx1 = s.indexOf('='); // 找到等号的位置

        // 分情况讨论问号的位置
        if (idx == 0) { // 问号在最前面
            char c = s.charAt(idx + 1); // 获取操作符
            int a = calc(idx + 2, idx1 - 1, s); // 计算左侧数字
            int b = calc(idx1 + 1, s.length() - 1, s); // 计算右侧数字
            // 根据操作符输出结果
            if (c == '+') System.out.println(b - a);
            else if (c == '-') System.out.println(b + a);
            else if (c == '*') System.out.println(b / a);
            else System.out.println(b * a);
        } else if (idx == s.length() - 1) { // 问号在最后面
            // 寻找并处理其他运算符
            int idxA = s.indexOf('+'), idxB = s.indexOf('-'), idxC = s.indexOf('*'), idxD = s.indexOf('/');
            // 根据找到的第一个运算符计算并输出结果
            if (idxA != -1) System.out.println(calc(0, idxA - 1, s) + calc(idxA + 1, idx1 - 1, s));
            else if (idxB != -1) System.out.println(calc(0, idxB - 1, s) - calc(idxB + 1, idx1 - 1, s));
            else if (idxC != -1) System.out.println(calc(0, idxC - 1, s) * calc(idxC + 1, idx1 - 1, s));
            else System.out.println(calc(0, idxD - 1, s) / calc(idxD + 1, idx1 - 1, s));
        } else if (idx == idx1 - 1) { // 问号紧挨着等号前
            char c = s.charAt(idx - 1); // 获取操作符
            int a = calc(0, idx - 2, s); // 左侧数字
            int b = calc(idx1 + 1, s.length() - 1, s); // 右侧数字
            // 根据操作符输出结果
            if (c == '+') System.out.println(b - a);
            else if (c == '-') System.out.println(a - b);
            else if (c == '*') System.out.println(b / a);
            else System.out.println(a / b);
        } else { // 问号在中间
            int a = calc(0, idx - 1, s); // 左边数字
            int b = calc(idx + 1, idx1 - 1, s); // 问号左边的数字
            int c = calc(idx1 + 1, s.length() - 1, s); // 右边数字
            // 判断并输出正确的操作符
            if (a + b == c) System.out.println('+');
            else if (a - b == c) System.out.println('-');
            else if (a * b == c) System.out.println('*');
            else System.out.println('/');
        }
    }
}

Python 版本(仅供参考)

# 定义一个函数来计算字符串s中从位置l到r的数字值
def calc(l, r, s):
    res = 0  # 初始化结果变量
    for i in range(l, r + 1):  # 遍历指定的索引范围
        res = res * 10 + int(s[i])  # 将字符转换为整数并累加到结果中
    return res  # 返回计算的整数值

# 获取用户输入的字符串
s = input()

# 查找问号和等号的位置
idx = s.find('?')
idx1 = s.find('=')

# 根据问号的位置处理不同情况
if idx == 0:  # 问号在最前面的情况
    c = s[idx + 1]  # 获取运算符
    a = calc(idx + 2, idx1 - 1, s)  # 计算左侧操作数
    b = calc(idx1 + 1, len(s) - 1, s)  # 计算右侧操作数
    # 根据运算符执行相应操作
    if c == '+':
        print(b - a)
    elif c == '-':
        print(b + a)
    elif c == '*':
        print(b // a)
    else:  # c == '/'
        print(b * a)

elif idx == len(s) - 1:  # 问号在最后面的情况
    # 寻找四种基本运算符的位置
    idxA, idxB, idxC, idxD = s.find('+'), s.find('-'), s.find('*'), s.find('/')
    # 根据找到的运算符执行相应的计算
    if idxA != -1:
        a = calc(0, idxA - 1, s)
        b = calc(idxA + 1, idx1 - 1, s)
        print(a + b)
    elif idxB != -1:
        a = calc(0, idxB - 1, s)
        b = calc(idxB + 1, idx1 - 1, s)
        print(a - b)
    elif idxC != -1:
        a = calc(0, idxC - 1, s)
        b = calc(idxC + 1, idx1 - 1, s)
        print(a * b)
    else:  # idxD != -1
        a = calc(0, idxD - 1, s)
        b = calc(idxD + 1, idx1 - 1, s)
        print(a // b)

elif idx == idx1 - 1:  # 问号在等号前一位的情况
    c = s[idx - 1]  # 获取运算符
    a = calc(0, idx - 2, s)  # 计算左侧操作数
    b = calc(idx1 + 1, len(s) - 1, s)  # 计算右侧操作数
    # 执行相应的计算
    if c == '+':
        print(b - a)
    elif c == '-':
        print(a - b)
    elif c == '*':
        print(b // a)
    else:  # c == '/'
        print(a // b)

else:  # 问号在其他位置的情况
    a = calc(0, idx - 1, s)  # 计算左侧操作数
    b = calc(idx + 1, idx1 - 1, s)  # 计算中间操作数
    c = calc(idx1 + 1, len(s) - 1, s)  # 计算右侧操作数
    # 检查哪一种运算符能使等式成立,并打印它
    if a + b == c:
        print('+')
    elif a - b == c:
        print('-')
    elif a * b == c:
        print('*')
    else:  # a / b == c
        print('/')

代码和解题细节:

  1. 正确处理边界条件

    • 确保在处理字符串索引时避免越界。例如,在计算数值或查找运算符之前,确认索引位置在字符串的有效范围内。
    • 当处理除法时,仔细检查除数是否为0,以避免运行时错误。
  2. 识别唯一解的约束

    • 题目明确指出有唯一解,这意味着在尝试不同运算符或计算过程时,应直接寻找能够满足这一条件的解,而不是考虑多种可能性。
  3. 注意整数除法的处理

    • 当涉及整数除法(/)时,确保使用整数除法运算符(在C++中是/,但在某些语言中可能需要特别指定),并且理解其结果会向下取整。
  4. 优化逻辑判断

    • 对于特定情况的处理(如问号在不同位置),代码中已经进行了区分。但应注意逻辑的简洁性和效率,避免不必要的重复计算或复杂的嵌套条件。
  5. 处理特殊字符和格式

    • 确保输入处理时考虑到所有可能的格式问题,如前导零、额外的空格等,尽管题目说明不会有这些问题,但在实际编程时这些往往是常见的输入错误来源。

觉得有用的话可以点点赞,支持一下。

如果愿意的话关注一下。会对你有更多的帮助。

每天都会不定时更新哦  >人<  。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1717125.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

科迅图书馆云平台 WebCloud.asmx SQL注入致RCE漏洞复现

0x01 产品简介 科迅图书馆云平台又称集群式图书管理系统是采用B/S架构的垂直管理模式,管理系统下设城市集群式图书馆管理系统+电子阅览室+门户网站,不仅实现了总馆对分馆的在线管理,而且实现了资源共享和建设图书馆联合服务体系,可以方便读者在图书馆门户网站或者其中任何…

CSS绘制圆弧

css绘制如图的圆弧&#xff1a; 这种矩形弧形的效果中&#xff0c;弧形的效果一般是由一条曲线拉伸出来的&#xff0c;这条曲线往往是属于一个椭圆的&#xff0c;所以可以绘制一个椭圆&#xff0c;截取部分可视区域实现效果。 <style> .wrapper{width: 400px;height: 60…

工业相机识别电路板元器件:彩色与黑白的区别

工业相机用于识别电路板上的元器件时&#xff0c;选择彩色相机或黑白相机取决于具体应用需求和条件。彩色相机能提供更丰富的信息&#xff0c;但处理复杂度较高&#xff1b;黑白相机则在处理速度和精度上具有优势。理解它们的区别和各自的优缺点&#xff0c;有助于在具体项目中…

PromptIR论文阅读笔记

MZUAI和IIAI在NIPS2023上的一篇论文&#xff0c;用prompt来编码degradation&#xff0c;然后用来guide restoration network&#xff0c;使得模型能够泛化到不同degradation types and levels&#xff0c;也就是说是一个模型一次训练能够应对多种degradation的unified model。文…

Satellite Stereo Pipeline学习

1.在Anaconda某个环境中安装s2p pip install s2p 2.在Ubuntu系统中安装s2p源代码 git clone https://github.com/centreborelli/s2p.git --recursive cd s2p pip install -e ".[test]" 3.在s2p中进行make all处理 中间会有很多情况&#xff0c;基本上哪个包出问题…

【机器学习】Adaboost: 强化弱学习器的自适应提升方法

&#x1f308;个人主页: 鑫宝Code &#x1f525;热门专栏: 闲话杂谈&#xff5c; 炫酷HTML | JavaScript基础 ​&#x1f4ab;个人格言: "如无必要&#xff0c;勿增实体" 文章目录 Adaboost: 强化弱学习器的自适应提升方法引言Adaboost基础概念弱学习器与强学习…

Docker 图形化界面管理工具 Portainer | 让你更轻松的管理 Docker

本文首发于只抄博客&#xff0c;欢迎点击原文链接了解更多内容。 前言 Portainer 是一个 Docker 图形化管理工具&#xff0c;可以通过 Web UI 轻松的管理容器、镜像、网络、卷。与 Dockge 相比功能更加的完善&#xff0c;同时上手难度也更大一些 Portainer 分为社区版和商业版…

实战16:基于apriori关联挖掘FP-growth算法挖掘关联规则的手机销售分析-代码+数据

直接看视频演示: 基于apriori关联挖掘关联规则的手机销售分析与优化策略 直接看结果: 这是数据展示: 挖掘结果展示: 数据分析展示:

el-table中的信息数据过长 :show-overflow-tooltip=‘true‘**

可以在 el-table-column中添加 :show-overflow-tooltip‘true’

【机器学习】AI大模型的探索—浅谈ChatGPT及其工作原理

&#x1f4dd;个人主页&#xff1a;哈__ 期待您的关注 目录 &#x1f4da;介绍ChatGPT 1.1 什么是ChatGPT 1.2 ChatGPT的应用场景 &#x1f4a1;基础概念 1. 人工智能和机器学习 1.1 人工智能&#xff08;AI&#xff09;简介 1.2 机器学习&#xff08;ML&#xff09;简…

RAG技术探索

什么是RAG 1 RAG原理 RAG&#xff08;Retrieval Augmented Generation, 检索增强生成&#xff09;&#xff0c;即LLM在回答问题或生成文本时&#xff0c;先会从大量文档中检索出相关的信息&#xff0c;然后基于这些信息生成回答或文本&#xff0c;从而提高预测质量。RAG模型尤…

生态融合促发展 YashanDB与丰图科技完成兼容性认证

近日&#xff0c;深圳计算科学研究院崖山数据库系统YashanDB V23与丰图科技智域城市数字孪生平台顺利完成兼容性互认证。经严格测试&#xff0c;双方产品完全兼容&#xff0c;稳定运行&#xff0c;充分满足企事业单位在高性能、高可用性、高稳定性及高可控性方面的核心需求&…

Redis 和 Mysql 如何保证两者数据一致性

文章目录 概述解决方案消息队列异步重试 基于 RocketMQ 的可靠性消息通信&#xff0c;来实现最终一致Canal 组件&#xff0c;监控 Mysql 中 binlog 的日志&#xff0c;把更新后的数据同步到 Redis 里面延时双删弱一致性和强一致性Canal详解 概述 在分布式系统中&#xff0c;保…

YoloV8改进策略:卷积篇|基于PConv的二次创新|附结构图|性能和精度得到大幅度提高(独家原创)

摘要 在PConv的基础上做了二次创新,创新后的模型不仅在精度和速度上有了质的提升,还可以支持Stride为2的降采样。 改进方法简单高效,需要发论文的同学不要错过! 论文指导 PConv在论文中的描述 论文: 下面我们展示了可以通过利用特征图的冗余来进一步优化成本。如图3所…

动手学深度学习27 GoogLeNet

动手学深度学习27 含有并行连结的网络GoogLeNet/Inception V3 1. GoogLeNet2. 代码3. QA 1. GoogLeNet 白色块用来处理通道数&#xff0c;蓝色块用来抽取信息 stage 高宽减半做完表示一个stage完成 大量使用1*1卷积 降低通道数 更小的窗口 Inception V2 diff v3 …

Dify数据库结构导出到PowerDesigner

即刻关注&#xff0c;获取更多 关注公众号 N学无止界 获取更多 Dify数据库结构导出到PowerDesigner Dify简介 Dify简介 欢迎使用 Dify Dify 是一款开源的大语言模型(LLM) 应用开发平台。它融合了后端即服务&#xff08;Backend as Service&#xff09;和 LLMOps 的理念&…

大数据中的电商数仓项目:探秘业务的核心

我学习完一个电商数仓的项目和电影实时推荐项目&#xff0c;便兴冲冲的去面试大数据开发岗&#xff0c;在面试的时候&#xff0c;面试官总是喜欢问&#xff0c;聊聊你为什么要做这个项目以及你这个项目有哪些业务&#xff1f; 我心想&#xff0c;为什么要做这个业务&#xff1f…

探究 Meme 的金融与社交属性

原文标题&#xff1a;《A Social and Financial Study of Memecoins》撰文&#xff1a;Andrew Hong编译&#xff1a;Chris&#xff0c;Techub News 每一个市场周期都伴随着 Meme 代币的出现。一群人围绕着某个 Meme 集结起来&#xff0c;暂时抬高了某个资产的价格&#xff08;从…

多维时序 | Matlab实现SA-BP模拟退火算法优化BP神经网络多变量时间序列预测

多维时序 | Matlab实现SA-BP模拟退火算法优化BP神经网络多变量时间序列预测 目录 多维时序 | Matlab实现SA-BP模拟退火算法优化BP神经网络多变量时间序列预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.Matlab实现SA-BP模拟退火算法优化BP神经网络多变量时间序列预…

5G NR TAE TEST

环境配置&#xff1a; 测试TAE时&#xff0c;需要比对不同的Antenna Port之间的差异来测试 配置DL 2 layer MU的case layer1&#xff1a;通过设置weight&#xff0c;只有一个物理天线上有weight&#xff0c;其他天线上的weight为0&#xff0c;该天线的DMRS DMRS Port设置为1…