贤鱼的刷题日常--P1022 [NOIP2000 普及组] 计算器的改良--题目详解

简介: 🍀学习了解P1022 [NOIP2000 普及组] 计算器的改良
🏆今日学习目标:
🍀学习了解P1022 [NOIP2000 普及组] 计算器的改良
✅创作者:贤鱼
⏰预计时间:15分钟

请添加图片描述

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

题目背景

NCL 是一家专门从事计算器改良与升级的实验室,最近该实验室收到了某公司所委托的一个任务:需要在该公司某型号的计算器上加上解一元一次方程的功能。实验室将这个任务交给了一个刚进入的新手 ZL 先生。

题目描述

为了很好的完成这个任务,ZL 先生首先研究了一些一元一次方程的实例:

  • $4+3x=8$。
  • $6a-5+1=2-2a$。
  • $-5+12y=0$。

ZL 先生被主管告之,在计算器上键入的一个一元一次方程中,只包含整数、小写字母及 +-= 这三个数学符号(当然,符号“-”既可作减号,也可作负号)。方程中并没有括号,也没有除号,方程中的字母表示未知数。

你可假设对键入的方程的正确性的判断是由另一个程序员在做,或者说可认为键入的一元一次方程均为合法的,且有唯一实数解。

输入格式

一个一元一次方程。

输出格式

解方程的结果(精确至小数点后三位)。

样例 #1

样例输入 #1

6a-5+1=2-2a

样例输出 #1

a=0.750

思路

一元一次方程,不需要配方啥的乱七八糟,所以我们直接存下x的系数和常数就可以
我们默认将所有的常数移到右边
这里我们要分开处理

1等号两边

如果在等号左边,有未知数的一项直接按照加减处理就可以,如果在另一边,转换的时候需要变号
常数项与其相反,在等号左边的话需要变号,右边则不需要
==等号处理完了,需要处理一下括号了==

处理括号

在上面的基础上,括号里变一下号就好了
==答案记得开double==

AC代码

#include<cmath>
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
char a[10006]; 
int main(){
    cin>>a;
    int c=strlen(a);
    int wc=0;
    char sss;//sss储存一下未知数,这个题不一定全是xy之类的
    for(int i=0;i<=c;i++){//下面全是按照题目要求处理就可以了
        if(a[i]=='('){
            wc=1;
            c-=1;
            for(int j=i;j<=c;j++){
                a[j]=a[j+1];
            }
        }
        if(a[i]==')'){
            wc=0;
            c-=1;
            for(int j=i;j<=c;j++){
                a[j]=a[j+1];
            }
        }
        if(wc){
            if(a[i]=='+'){
                a[i]='-';
            }else if(a[i]=='-'){
                a[i]='+';
            }

        }
    }
    a[c]='-';
    for(int i=0;i<=c;i++){
        if(a[i]!='='&&a[i]!='-'&&a[i]!='+'&&!isdigit(a[i])){
            sss=a[i];
            a[i]='x';
        }
    }
    int fg=0;
    double wcc=0;
    double x=0,y=0;
    int p=1;
    for(int i=0;i<=c;i++){
        if(a[i]=='x'&&(!isdigit(a[i-1])))
        {
            wcc=1;
        }
        if (isdigit(a[i]))
            wcc=wcc*10+(a[i]-'0');
        if((a[i-1]<='9'&&a[i-1]>='0')&&(a[i]=='-'||a[i]=='+'||a[i]=='=')){
            wcc=wcc*p;
            if(!fg){
                y=y-wcc;    
            }else{
                y=y+wcc;
            }
            wcc=0;
        }else if(a[i]=='x'){
            wcc=wcc*p;
            if(!fg){
                x+=wcc;
            }else{
                x-=wcc;
            }
            wcc=0;    
        }
        if(a[i]=='+'||a[i]=='='||a[i]=='-'){
            if(a[i]=='-'){
                p=-1;
            }else {
                p=1;
            }}    
        if(a[i]=='='){
            fg=1;
        }
    }
    double ww;
    ww=y/x;
    if(ww==0) ww=0;
    cout<<sss<<"=";
    printf("%.3lf\n",ww);
} 



请添加图片描述

相关文章
|
5月前
|
存储
【洛谷 P2141】[NOIP2014 普及组] 珠心算测验 题解(集合+多重循环)
**NOIP2014普及组的珠心算测验题要求参赛者找出给定集合中多少个数可表示为其他两个不同数的和。输入含n个正整数,输出满足条件的数的个数。样例输入4个数,输出2,因1+2=3且1+3=4。代码利用集合存储和,遍历所有数对组合,当找到匹配和时插入集合,最后输出集合大小。注意数据规模为n≤100,数不超过10,000。**
125 0
|
5月前
|
C++
【洛谷 P2670】[NOIP2015 普及组] 扫雷游戏 题解(模拟)
**扫雷游戏NOIP2015普及组题目:**在$n\times m$的雷区,玩家需避开地雷格(*),翻开非地雷格(?)显示周围地雷数。给定雷区布局,输出每个格子的地雷数或保持*不变。输入含雷区大小及布局,输出相应格式。样例输入/输出展示具体规则。100%数据$n,m\leq100$。程序思路:检查邻接8格,AC代码用C++实现。
38 0
|
5月前
【洛谷 P1046】[NOIP2005 普及组] 陶陶摘苹果 题解(比较)
`NOIP2005普及组`编程题《陶陶摘苹果》:陶陶有10个高度在100-200cm的苹果要摘,手触及最大高度+30cm板凳后能摘到的苹果数。输入10个苹果高度和她的最大触及高度,输出可摘苹果数。样例输入:10个苹果高度和110cm触及高度,输出5,表示能摘5个。代码通过逐个比较苹果高度实现统计。
71 0
|
5月前
|
C++
【洛谷 P1042】[NOIP2003 普及组] 乒乓球 题解(模拟+向量)
`NOIP2003`普及组编程题:乒乓球比赛模拟。给定一系列球赛记录(WL序列),程序需按11分和21分制分析比分。输入含多个字符串,含W(华华得分)、L(对手得分)和E(结束标记)。输出每局比分,分制间空行间隔。样例:`WWWWWW...` → `11:0\n11:0\n1:1`(11分制)和`21:0\n2:1`(21分制)。代码使用C++,逐字符读取,当分差≥2且得分≥x时输出比分。
45 0
【牛客IOI周赛26-普及组】A-平行四边形
【牛客IOI周赛26-普及组】A-平行四边形
P1093 [NOIP2007 普及组] 奖学金(模拟排序)
P1093 [NOIP2007 普及组] 奖学金(模拟排序)
55 0
[算法刷题题解笔记] 洛谷 P1008 [NOIP1998 普及组] 三连击 [枚举|模拟]
[算法刷题题解笔记] 洛谷 P1008 [NOIP1998 普及组] 三连击 [枚举|模拟]
【2012NOIP普及组】T1. 质因数分解 试题解析
【2012NOIP普及组】T1. 质因数分解 试题解析
蓝桥杯之单片机学习(二十一)——自动售水机(附题目和完整代码)
蓝桥杯之单片机学习(二十一)——自动售水机(附题目和完整代码)
373 0
蓝桥杯之单片机学习(二十一)——自动售水机(附题目和完整代码)
下一篇
无影云桌面