1015 计算器的改良 2000年NOIP全国联赛普及组
时间限制: 1 s
空间限制: 128000 KB
题目等级 : 白银 Silver
题解
题目描述 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
#include
#include
#include
#include
using namespace std;
const int MAXN = 105;
char s[MAXN],c[MAXN],news;
int n[MAXN],ks[MAXN],se;
int lens,k = -1,x = 0,y = 0;
int len2 = 0;
bool flag = false,xccc = false;
double num1 = 0,num2 = 0;
int main()
{
cin >> s;
lens = strlen(s);
for(int i = 0; i < lens; i ++)
{
if(i == lens - 1) xccc = true;
if((k != -1 && (s[i] == '+' || s[i] == '-' || s[i] == '=')) || xccc == true)
{
len2 = 0;flag = false;
memset(c,0,sizeof(c));
if(xccc == true)
{
for(int j = i - k - 1; j < i + 1; j ++)
{
if('a' > s[j] || s[j] > 'z') c[len2] = s[j],len2 ++;
else news = s[j],flag = true;
}
}
else
{
for(int j = i - k - 1; j < i; j ++)
{
if('a' > s[j] || s[j] > 'z') c[len2] = s[j],len2 ++;
else news = s[j],flag = true;
}
}
sscanf(c,"%d",&n[x]);
memset(c,0,sizeof(c));
if(flag == true) ks[y] = x,y ++;
x ++,k = -1;
}
k ++;
if(s[i] == '=') se = x,k = -1;
}
for(int i = 0; i < y; i ++)
{
if(ks[i] < se) num1 += n[ks[i]];
else num1 -= n[ks[i]];
}
for(int i = 0; i < x; i ++)
{
if(i < se) num2 -= n[i];
else num2 += n[i];
}
num2 += num1;
printf("%c=%.3lf",news,num2 / num1);
return 0;
}