洛谷 P1022 计算器的改良 题解

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了洛谷 P1022 计算器的改良 题解相关的知识,希望对你有一定的参考价值。

此文为博主原创题解,转载时请通知博主,并把原文链接放在正文醒目位置。

题目链接:https://www.luogu.org/problem/show?pid=1022

题目背景

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

题目描述

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

4+3x=8

6a-5+1=2-2a

-5+12y=0

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

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

输入输出格式

输入格式:

一个一元一次方程。

输出格式:

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

输入输出样例

输入样例#1:
6a-5+1=2-2a
输出样例#1:
a=0.750


分析:
玛德又被洛谷标签骗了...这跟数学有半毛钱关系么,就是个模拟...
用一个结构体tmp记录当前的数字(结构体是为了方便记录符号),不断地读入处理。
如果读到+/-,就修改下一个tmp的符号(因为对下一个数字有影响)
用变量left统计常数和(常数全部移项到等号左边),fenmu统计系数和(未知数全部移项到等号左边),最终答案就是left/(-fenmu)。


AC代码:
 1 #include<cstdio>
 2 #include<algorithm>
 3 #include<cmath>
 4 #include<cstring>
 5 
 6 inline void read(long long &x)
 7 {
 8     char ch = getchar(),c = ch;x = 0;
 9     while(ch < 0 || ch > 9) c = ch,ch = getchar();
10     while(ch <= 9 && ch >= 0) x = (x<<1)+(x<<3)+ch-0,ch = getchar();
11     if(c == -) x = -x;
12 }
13 
14 char s[100],unknown;
15 int left,fenmu,ans,change;
16 //left统计常数和,fenmu统计未知数的系数和 
17 struct NUM
18 {
19     int flag,num;
20     //flag标记tmp的正负 
21     NUM(){//构造函数 
22         flag = 1,num = 0;
23     }
24     void clear(){
25         flag = 1,num = 0;
26     }
27     
28 }tmp;
29 
30 int main()
31 {
32     scanf("%s",s+1);
33     int n = strlen(s+1);
34     for(int i = 1;i <= n;++ i)
35     {
36         while(s[i] >= 0 && s[i] <= 9)
37             tmp.num = tmp.num*10+s[i]-0,i++;
38         if(s[i]>=a && s[i]<=z)
39         {
40             unknown = s[i];
41             if(!tmp.num) tmp.num = 1;
42             if(change) fenmu -= tmp.flag*tmp.num;
43             else fenmu += tmp.flag*tmp.num;
44             tmp.clear();
45             continue;
46         }
47         //相当于在读入时就进行了移项操作 
48         if(change) left -= tmp.num*tmp.flag;
49         else    left += tmp.num*tmp.flag;
50         tmp.clear();
51         if(s[i] == -) tmp.flag = -1;
52         if(s[i] == +) tmp.flag = 1;
53         if(s[i] == =) change = 1;
54         //change=1表示当前在等号的右边,移项需要变号 
55     }
56     double ans = (double)left/(-fenmu);
57     //由于未知数和常数最终应该位于等号两侧相除,所以分母取相反数 
58     printf("%c=%.3lf\n",unknown,ans);
59     return 0;
60 }

 

以上是关于洛谷 P1022 计算器的改良 题解的主要内容,如果未能解决你的问题,请参考以下文章

洛谷 P1022 计算器的改良

洛谷—— P1022 计算器的改良

洛谷——P1022 计算器的改良

[NOIP2000] 提高组 洛谷P1022 计算器的改良

LGOJ P1022 计算器的改良

洛谷 P1313 计算系数 题解