CODEVS 1015 计算器的改良

题目描述 Description

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

4+3x=8

6a-5+1=2-2a

-5+12y=0

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

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

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

输入描述 Input Description

一个一元一次方程

输出描述 Output Description

方程的解

样例输入 Sample Input

6a-5+1=2-2a

样例输出 Sample Output

a=0.750

数据范围及提示 Data Size & Hint

注意加减号都是半角

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
bool is_int(char a){
return a >= '0' && a <= '9';
}
bool is_alpha(char a){
return a >= 'a' && a <= 'z';
}
int main(){
char e[1000];
double n = 0;      
double m = 0;            
double k = 0;               
char x;                       
bool is_minus, pass_equal = false;
scanf("%s", e);
for(int i = 0; i < strlen(e); ++i, n=0){
if(e[i] == '='){
pass_equal = true;
}
is_minus = false;
if(i > 0 && e[i-1] == '-'){
is_minus = true;
}
if(is_int(e[i])){
int j;
for(j = i; is_int(e[j]); ++j){
n = n*10 + (e[j]-'0');
++i;
}
--i;
if(is_minus){
n = -n;
}
if(is_alpha(e[j])){
x = e[j];
if(!pass_equal) m += n;
else m -= n;
}
else{
if(!pass_equal) k += n;
else k -= n;
}
}
}
printf("%c=%.3lf\n", x, k == 0?0:-k/m);
return 0;
}

 

此条目发表在CODEVS, NOIP分类目录。将固定链接加入收藏夹。