洛谷 / 题目列表 / 题目详情
P1022 计算器的改良
题目背景
NCLNCL是一家专门从事计算器改良与升级的实验室,最近该实验室收到了某公司所委托的一个任务:需要在该公司某型号的计算器上加上解一元一次方程的功能。实验室将这个任务交给了一个刚进入的新手ZL先生。
题目描述
为了很好的完成这个任务,ZLZL先生首先研究了一些一元一次方程的实例:
4+3x=84+3x=8
6a-5+1=2-2a6a−5+1=2−2a
-5+12y=0−5+12y=0
ZLZL先生被主管告之,在计算器上键入的一个一元一次方程中,只包含整数、小写字母及+、-、=这三个数学符号(当然,符号“-”既可作减号,也可作负号)。方程中并没有括号,也没有除号,方程中的字母表示未知数。
你可假设对键入的方程的正确性的判断是由另一个程序员在做,或者说可认为键入的一元一次方程均为合法的,且有唯一实数解。
输入格式
一个一元一次方程。
输出格式
解方程的结果(精确至小数点后三位)。
stringstream:
stringstream是 C++ 提供的另一个字串型的串流(stream)物件,和之前学过的iostream、fstream有类似的操作方式。要使用stringstream, 必须先加入这一行:
#include
stringstream主要是用在將一个字符串分割,可以先用.clear( )以及.str( )將指定字串设定成一开始的內容,再用>>把个別的资料输出。
stringstream也可以用作字符串和整数相互转换。
思路:强行模拟,把两个±号之间的字符看成一个数(注意用数组记录每个加减号的位置),判断是系数还是常数,然后分别计算总和。
#include<iostream>
#include<string>
#include<cstring>
#include<cstdio>
#include<sstream>
#include<cctype>
using namespace std;
int ant[11];
int rnt[11];
int main()
{
int k=0;//等号左边加减号个数
int k2=0;//等号右边加减号个数
char c;//记录未知数
string s; 记录方程
float num=0,xishu=0; //系数和常数和
int begin=0,stop=0; //每次判断中加减号的位置;
cin >>s;
string s2="+0+0+0"; //玄学加长方程避免某些玄学bug
s+=s2; //加长
int step; // sstream的整数值
int mid=s.find('='); //找到中间位置
//定义好了,让我们开始,嘤嘤嘤。
//等号左边
for(int i=1;i<=mid;i++) // 例如-17x+3=0,第一个加减号不计;
{
if(s[i]=='+'||s[i]=='-')
{
ant[k]=i; // 找到加减号的位置
k