洛谷 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 计算器的改良 题解的主要内容,如果未能解决你的问题,请参考以下文章