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

目录

题目

思路和解题方法

步骤 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. 处理特殊字符和格式

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

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

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

STM32自己从零开始实操03:输出部分原理图

一、继电器电路 1.1指路 延续使用 JZC-33F-012-ZS3 继电器&#xff0c;设计出以小电流撬动大电流的继电器电路。 &#xff08;提示&#xff09;电路需要包含&#xff1a;三极管开关电路、续流二极管、滤波电容、指示灯、输出部分。 1.2数据手册重要信息提炼 联系排列&…

神经网络与深度学习——第3章 线性模型

本文讨论的内容参考自《神经网络与深度学习》https://nndl.github.io/ 第3章 线性模型 线性模型 线性模型&#xff08;Linear Model&#xff09;是机器学习中应用最广泛的模型&#xff0c;指通过样本特征的线性组合来进行预测的模型&#xff0c;给定一个 D D D维样本 x [ x …

解锁 GPT-4o 背后数据带来的情绪价值

GPT-4o 可以说已经是一个富有情感、通人性的智能语音助手&#xff0c;或者更准确地说&#xff0c;是一个越来越接近人类交互的 “新物种”。这个强大的模型同时具备文本、图片、视频和语音理解和合成方面的能力&#xff0c;甚至可以被视为 GPT-5 的一个未完成版。 01 富有情感的…

lipo制作通用版本静态库

文章目录 目的了解多架构的maclipo如何利用lipo编译通用版本静态库lipo 命令整理扩展目的 主要是使用lipo命令在macOS上创建通用版本的静态库(.a文件),来支持多种架构,如arm64,x86_64。 学习目的: 了解mac 不同架构arm64, x86_64了解lipo命令了解多架构的mac 随着appl…

Linux - 文件管理高级1

0.管道 | 将前面命令的标准输出传递给管道作为后面的标准输入 1.文件查找 find find 进行文件查找时&#xff0c;默认进行递归查找&#xff0c;会查找隐藏目录下的文件 1.1 用法 # find 查找路径 查找条件... -type // 文件类型 f 普通文件 b 设备 d …

数据目录用处如此之大?四个步骤教你构建数据目录

在数字化浪潮的推动下&#xff0c;数据已成为企业决策的核心。然而&#xff0c;随着数据量的爆炸性增长&#xff0c;如何高效地管理和利用这些宝贵的数据资产&#xff0c;成为了一个日益严峻的挑战。企业需要一个强大的工具来组织、索引和解释其数据&#xff0c;以便快速发现和…

代理IP怎么检测?如何判断IP好坏?

当我们的数字足迹无处不在&#xff0c;隐私保护显得愈发重要。而代理IP就像是我们的隐身斗篷&#xff0c;让我们在各项网络业务中更加顺畅。 我们常常看到别人购买了代理IP服务后&#xff0c;用在线检测网站检查IP&#xff0c;相当于一个”售前检验““售后质检”的作用。但是…

图书管理系统——Java实现

文章目录 Java实现图书管理系统问题分析框架搭建业务实现项目测试代码演示BookioperationUserMain&#xff08;默认包&#xff09; Java实现图书管理系统 学习了前六篇的SE语法&#xff0c;我们现在要用它们实现一个简单的图书管理系统项目&#xff0c;深入了解各个知识点的应…

【CH32V305FBP6】4. systick 配置

配置 main.c void SYSTICK_Init_Config(u_int64_t ticks) {SysTick->SR & ~(1 << 0);//clear State flagSysTick->CMP ticks - 1;SysTick->CNT 0;SysTick->CTLR 0xF;NVIC_SetPriority(SysTicK_IRQn, 15);NVIC_EnableIRQ(SysTicK_IRQn); }中断计数 …

算法-扫描线

目录 什么是扫描线算法&#xff1f; 扫描线简单应用 更多的扫描线 什么是扫描线算法&#xff1f; 在计算几何中&#xff0c;扫描线算法&#xff08;scan line algorithm&#xff09;一般用来解决几何图形的面积交并&#xff0c;周长交并问题&#xff0c;扫描线算法的核心思想…

Day 8:1461. 检查一个字符串是否包含所有长度为 K 的二进制子串

Leetcode 1461. 检查一个字符串是否包含所有长度为 K 的二进制子串 给你一个二进制字符串 s 和一个整数 k 。如果所有长度为 k 的二进制字符串都是 s 的子串&#xff0c;请返回 true &#xff0c;否则请返回 false 。 截取每个长度为 k 的字符串&#xff0c;加入 Set 中&#x…

wpf listbox实现选中动画

效果如下&#xff1a; 参考&#xff1a;https://github.com/WPFDevelopersOrg/WPFDevelopers/blob/master/src/WPFDevelopers.Samples.Shared/Controls/NavigateMenu/NavigateMenu.xaml 实现上述效果的前台代码&#xff1a; <Windowx:Class"ListBox.MainWindow"…

数据隐私新篇章:Facebook如何保护用户信息

随着数字化时代的到来&#xff0c;数据隐私保护成为了社交媒体平台和用户共同关注的焦点。作为全球最大的社交网络之一&#xff0c;Facebook一直致力于保护用户的隐私和数据安全。本文将深入探讨Facebook在数据隐私保护方面的措施和实践&#xff0c;以及其如何开启数据隐私的新…

C++系列-类模板

&#x1f308;个人主页&#xff1a;羽晨同学 &#x1f4ab;个人格言:“成为自己未来的主人~” 类模板的定义格式&#xff1a; #define _CRT_SECURE_NO_WARNINGS #include<iostream> using namespace std; template<class T> class Stack { public:Stack(size_…

u盘文件保密的方法有哪些?关于U盘的使用你要知道这些!

U盘作为便携式的存储设备&#xff0c;被广泛应用于日常工作和生活中。 然而&#xff0c;U盘的丢失或被盗可能导致敏感数据泄露&#xff0c;因此&#xff0c;掌握U盘文件保密的方法至关重要。 本文将介绍几种有效的U盘文件保密方法&#xff0c;并分享关于U盘使用的关键知识&…

BioVendor—Surfactant Protein D Human ELISA

人表面活性剂蛋白D是糖蛋白和钙依赖凝集素胶原亚家族的一员。SP-D是一种同源三聚体蛋白&#xff0c;由三个43kDa单元组成&#xff0c;这些单元在它们的中间结合。大多数SP-D主要含有十二聚体(四个三聚体亚单位)&#xff0c;但也观察到更高的多聚体。每个单元由至少四个离散的结…

旧衣回收小程序带来的收益优势,小程序有哪些功能?

随着互联网的快速发展&#xff0c;大众对旧衣回收市场也越来越了解&#xff0c;对于闲置的旧衣物也有了适合的处理方式。旧衣回收也符合了当下资源回收利用&#xff0c;因此&#xff0c;旧衣回收市场获得了爆发式增长&#xff0c;市场规模不断扩大。同时市场中还吸引了越来越多…

记录岁月云明细账excel导出的性能优化

财务软件报表还是非常麻烦&#xff0c;因为使用excel最好的就是财务&#xff0c;但是通过java导出excel&#xff0c;使用easyexcel不用报表工具&#xff0c;不是这么容易。采用jprofile对一个导出操作进行监控&#xff0c;其中一家零售企业导出当月全部明细账&#xff0c;检测到…

MySQL数据库--从创建数据库到删库跑路

目录 MySQL安装: 1. 数据库基本操作1.1 创建数据库1.2 显示当前数据库1.3 删除数据库1.4 使用数据库/选中数据库 2. SQL中的数据类型2.1 数值类型2.2 字符串类型2.3 时间类型 3. 表的操作3.2 创建表3.1 显示数据库中的表3.3 查看表的详细情况3.4 删除表3.5 注释3. 修改列(了解即…

dubbo复习:(18)服务端Filter

用来在服务响应返回到客户端之前进行额外处理。 一、定义Filter package cn.edu.tju.config;import org.apache.dubbo.rpc.Filter; import org.apache.dubbo.rpc.Result; import org.apache.dubbo.rpc.Invoker; import org.apache.dubbo.rpc.Invocation; import org.apache.du…