【模拟】计算器的改良

题目描述:

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

4+3x=8

6a-5+1=2-2a

-5+12y=0

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

编写程序,解输入的一元一次方程,将解方程的结果(精确至小数点后三位)输出至屏幕。

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

输入格式

每个测试文件只包含一组测试数据,每组输入一个字符串,表示一个一元一次方程。

输出格式:

对于每组输入数据,解方程的结果(精确至小数点后三位)输出至屏幕。

输入样例:

6a-5+1=2-2a

输出格式:

a=0.750

AC代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
#include<iostream>
#include<cstring>
using namespace std;
int main() {
char input[1000];
//记录未知数X
char x;
//是否在左,是否为正
int isLeft=1,isPo=1;
//项,常数
int alNum=0,diNum=0;
//用于计数
int num=0;
scanf("%s",input);
int len=strlen(input);
for(int i=0; i<len; ++i){
if(isdigit(input[i])){
num=num*10+(input[i]-'0');
}
if(isalpha(input[i])){
x=input[i];
if(num==0){
alNum=alNum+(isPo); //a=2a
}else{
alNum+=num*isPo*isLeft;
}
num=0;
}
if(input[i]=='+'){
diNum+=num*isLeft*isPo;
isPo=1;
num=0;
}
if(input[i]=='-'){
diNum+=num*isLeft*isPo;
isPo=-1;
num=0;
}
if(input[i]=='='){
diNum+=num*isLeft*isPo;
isLeft=-1;
isPo=1;
num=0;
}
}
diNum+=num*isLeft*isPo;//a=1
printf("%c=",x);
printf("%.3lf",(double)(-diNum)/(double)alNum);
return 0;
}
如果你觉得有帮助,慷慨如你,可以扫描下面的二维码赞赏一下