首页 > 其他分享 >[NOIP2000 普及组] 计算器的改良

[NOIP2000 普及组] 计算器的改良

时间:2023-08-13 09:44:42浏览次数:43  
标签:一次方程 未知数 NOIP2000 改良 int texttt mid && 计算器

题目描述

输入一个一元一次方程,求它的解(精确到小数点后三位)。

方程中,只包含整数、小写字母及 \(\texttt{+}\)、\(\texttt{-}\)、\(\texttt{=}\) 这三个数学符号(当然,符号“\(\texttt{-}\)”既可作减号,也可作负号)。

方程中并没有括号,也没有除号,方程中的字母表示未知数。

键入的一元一次方程均为合法的,且有唯一实数解。

分析

回顾一下解一元一次方程的过程,可以发现,所有步骤都是为了将未知数放在等号一边(左边),常量放在等号另一边(右边),然后将系数化为一。
因此,可以分析读入的方程,将数字加在一起,未知数的系数加在一起,最后计算。
注意处理好未知数系数为一的情况。

代码

#include <iostream>
#include <string>

using namespace std;

string t;
int l, r, x/*未知数系数和*/, n/*常量和*/, mid;
int main() {
    cin >> t;
    x = 0;
    while (t[mid] != '=') mid++; //找到等号
    for (int i = 0; i < t.length(); i++)//寻找未知数并输出
        if (t[i] >= 'a' && t[i] <= 'z') {
            cout << t[i] << '=';
            break;
        }

    //处理未知数系数为一的情况
    if (t[0]>='a'&&t[0]<='z') {
        t[0]=0;
        x++;
    }
    if (t[mid+1]>='a'&&t[mid+1]<='z') {
        t[mid+1]=0;
        x++;
    }

    for (int i=0; i < mid; i++) {
        if (t[i] >= '0' && t[i] <= '9') {
            l = r = i;
            while (t[r+1] >= '0' && t[r+1] <= '9') r++;
            if (r < t.length())
                if (t[r+1] >= 'a' && t[r-1] <= 'z') {
                    if (l == 0) {
                        x += atoi(t.substr(l, r-l+1).c_str());
                        for (int k = l; k <= r; k++) t[k] = 0;
                    }
                    else {
                        if (t[l-1] == '-')
                            x -= atoi(t.substr(l, r - l + 1).c_str());
                        else
                            x += atoi(t.substr(l, r - l + 1).c_str());
                        for (int k=l-1; k <= r; k++) t[k] = 0;
                    }
                    continue;
                }
            if (l == 0) {
                n -= atoi(t.substr(l, r-l+1).c_str());
                for (int k = l; k <= r; k++) t[k] = 0;
            }
            else {
                if (t[l-1] == '-')
                    n += atoi(t.substr(l, r - l + 1).c_str());
                else
                    n -= atoi(t.substr(l, r - l + 1).c_str());
                for (int k=l-1; k <= r; k++) t[k] = 0;
            }
        }
    }

    //注意等号左右未知数系数与常量的加减情况是相反的
    for (int i=mid+1; i < t.length(); i++) {
        if (t[i] >= '0' && t[i] <= '9') {
            l = r = i;
            while (t[r+1] >= '0' && t[r+1] <= '9') r++;
            if (r < t.length())
                if (t[r+1] >= 'a' && t[r-1] <= 'z') {
                    if (l == 0) {
                        x -= atoi(t.substr(l, r - l + 1).c_str());
                        for (int k = l; k <= r; k++) t[k] = 0;
                    }
                    else {
                        if (t[l-1] == '-')
                            x += atoi(t.substr(l, r - l + 1).c_str());
                        else
                            x -= atoi(t.substr(l, r - l + 1).c_str());
                        for (int k = l - 1; k <= r; k++) t[k] = 0;
                    }
                    continue;
                }
            if (t[l-1] == '-')
                n -= atoi(t.substr(l, r - l + 1).c_str());
            else
                n += atoi(t.substr(l, r - l + 1).c_str());
            for (int k = l - 1; k <= r; k++) t[k] = 0;
        }
    }
    printf("%.3lf", double(n) / x);
    return 0;
}

标签:一次方程,未知数,NOIP2000,改良,int,texttt,mid,&&,计算器
From: https://www.cnblogs.com/sleepboth/p/17626166.html

相关文章

  • 关于读者阅读“改良版雪花算法”后提出的几个共性问题的回复
    你好呀,我是歪歪。周一的时候不是发了《在开源项目中看到一个改良版的雪花算法,现在它是你的了。》这篇破文章嘛。然后有好几个读者都提出了几个类似的问题,再写个续集,给大家解答一下。我就喜欢这种和读者有来有回,相互拉扯的感觉。突出一个“相互学习,共同进步。”超前消费首先......
  • 在开源项目中看到一个改良版的雪花算法,现在它是你的了。
    你好呀,我是歪歪。在Seata的官网上看到一篇叫做“关于新版雪花算法的答疑”的文章。http://seata.io/zh-cn/blog/seata-snowflake-explain.html看明白之后,我觉得还是有点意思的,结合自己的理解和代码,加上画几张图,给你拆解一下Seata里面的“改良版雪花算法”。虽然是在Se......
  • 7-12 两个数的简单计算器 (10分)
    7-12 两个数的简单计算器 (10分)7-12 两个数的简单计算器 (10分)本题要求编写一个简单计算器程序,可根据输入的运算符,对2个整数进行加、减、乘、除或求余运算。题目保证输入和输出均不超过整型范围。输入格式:输入在一行中依次输入操作数1、运算符、操作数2,其间以1个空格分隔。操......
  • 09 简易计算器,回顾组合与内部类
    oop原则:组合大于继承继承:classAextendsB{}组合:classA{publicBb}由面向过程逐步转变为面向对象对象.方法packageGUI;importjava.awt.*;importjava.awt.event.ActionEvent;importjava.awt.event.ActionListener;/*oop原则:组合大于继承继承:classAextendsB......
  • python 实现栅格计算器
    Python实现栅格计算器整体流程为了实现栅格计算器,我们需要按照以下步骤进行操作:步骤描述1.接收用户输入获取用户输入的操作数和运算符2.进行校验检查输入的操作数是否为数字,并检查运算符是否合法3.执行计算根据运算符执行相应的计算操作4.显示计算结果......
  • 原子计算器Atom4 2024版发布下载
    2024版更新记录:2024EditionupdateRecord:1、能计算2个粒子的弹性碰撞后的各自的速度。2、能计算球的对心和对切线轴的质量、半径和转动惯量之间的关系和数据。1,thevelocitycanningcomputetheempressoftheelasticcollisionof2gramulatesrespectively.2,can......
  • 算法——加减乘除计算器
    操作符号栈,数字栈遍历字符若是低优先级运算符(加、减),不断地弹出高优先级运算符(乘、除)栈顶运算符,直到栈为空或者栈顶不为高优先级运算符(乘、除)若是左括号运算符,加入操作栈,若是右括号运算符,不断地弹出栈顶运算符,直到栈顶为左括号若是数字,加入数字栈遍历完成后,若操作栈不为空,......
  • 224. 基本计算器
      通解思路虽然比较复杂:1.分割字符串,处理多位数字、孤单负号等情况2中缀转逆波兰表达式3逆波兰求解......
  • 简单的整数计算器
    //简单的整数计算器----堆栈的应用作者:秒大刀完成日期:2004-10-07这是一个将中序表达式变成后序表达式,并按照后序表达式进行整数四则运算是的程序mystak.h      计算器中的一个特殊堆栈,其中push()函数可以保证中序表达式->后序表达式过程中运算优先级别的合理性mystack.cpp......
  • 如何在Django中创建一个简单的计算器应用程序
    Django是一个免费开源的PythonWeb框架,可帮助您快速开发安全且可维护的Web应用程序。在本教程中,我将逐步指导您使用django创建计算器应用程序。这是一个适合初学者的教程,因此如果您是Django新手,可以继续学习。(更|多优质内|容:java567点c0m) 我们的计算器应用程序会......