欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

NOIP 2000 计算器的改良

程序员文章站 2022-08-28 11:11:01
题面 NCL是一家专门从事计算器改良与升级的实验室,最近该实验室收到了某公司所委托的一个任务:需要在该公司某型号的计算器上加上解一元一次方程的功能。实验室将这个任务交给了一个刚进入的新手ZL先生。 为了很好的完成这个任务,ZLZL先生首先研究了一些一元一次方程的实例: 4+3x=84+3x=8 6a ......

题面

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

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

4+3x=84+3x=8

6a-5+1=2-2a6a5+1=22a

-5+12y=05+12y=0

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

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

输入输出格式

输入格式:

一个一元一次方程。

输出格式:

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

样例

NOIP 2000 计算器的改良
6a-5+1=2-2a
输入
NOIP 2000 计算器的改良
a=0.750
输出

思路

本题打得我心态爆炸,我的思路是把字符串分为a(等号左边),b(等号右边)来计算。一开始先判断a的开头有没有减号,如果没有就加上加号,对b也一样。然后就是瞎jb用substr截取系数和未知数,用stringstream把字符串转为数字(如“123”转为123)

记得判-0.000 (c++里实数型如果0除以一个负数得-0,害得我浪费一次下载数据机会)

代码

略长勿喷

  1 #include<bits/stdc++.h>
  2 using namespace std;
  3 string s,a,b,x,y;
  4 char wzs;
  5 int weizhi,num,i,j;
  6 int main()
  7 {  
  8     cin>>s;
  9     int n=s.size();
 10     for (i=0;i<=n;i++) if (s[i]>='a'&&s[i]<='z'&&s[i]!='=') {wzs=s[i];break;}
 11     //cout<<wzs<<endl;
 12     a=s.substr(0,s.find("="));
 13     b=s.substr(s.find("=")+1,n-s.find("="));
 14     if (a[0]!='-') a='+'+a;
 15     if (b[0]!='-') b='+'+b;
 16     //cout<<a<<endl;
 17     for (i=1;i<=a.size();i++)
 18     {
 19         if (a[i-1]=='+')
 20         { 
 21         for (j=i;j<=a.size();j++) if (a[j+1]=='-'||a[j+1]=='+') break;
 22         string tmp=a.substr(i,j-i+1);
 23         //cout<<tmp<<endl;
 24         if ((int)tmp.find(wzs)!=-1)
 25         {
 26         x=tmp.substr(0,tmp.find(wzs));
 27         if (x=="") x="1";
 28         y=tmp.substr(tmp.find(wzs),tmp.size()-tmp.find(wzs)+1);
 29         //cout<<x<<" "<<y<<endl;
 30         stringstream trans;
 31         trans<<x;
 32         int ans;
 33         trans>>ans;    
 34         weizhi+=ans;    
 35         }
 36         else 
 37         {
 38         stringstream trans;
 39         trans<<tmp;
 40         int ans;
 41         trans>>ans;    
 42         //cout<<ans<<endl;
 43         num-=ans;
 44         }
 45         i=j;
 46         }
 47         if (a[i-1]=='-')
 48         {
 49          for (j=i;j<=a.size();j++) if (a[j+1]=='-'||a[j+1]=='+') break;
 50          string tmp=a.substr(i,j-i+1);
 51          //cout<<tmp<<endl;
 52         if ((int)tmp.find(wzs)!=-1)
 53         {
 54         x=tmp.substr(0,tmp.find(wzs));
 55         if (x=="") x="1";
 56         y=tmp.substr(tmp.find(wzs),tmp.size()-tmp.find(wzs)+1);
 57         //cout<<x<<" "<<y<<endl;
 58         stringstream trans;
 59         trans<<x;
 60         int ans;
 61         trans>>ans;    
 62         weizhi-=ans;
 63         }
 64         else 
 65         {
 66         stringstream trans;
 67         trans<<tmp;
 68         int ans;
 69         trans>>ans;    
 70         //cout<<ans<<endl;
 71         num+=ans;    
 72         }
 73          i=j;    
 74         }
 75     }
 76     /*右边*/
 77     //cout<<b<<endl;
 78     for (i=1;i<=b.size();i++)
 79     {
 80         if (b[i-1]=='+')
 81         { 
 82         for (j=i;j<=b.size();j++) if (b[j+1]=='-'||b[j+1]=='+') break;
 83         string tmp=b.substr(i,j-i+1);
 84         //cout<<tmp<<endl;
 85         if ((int)tmp.find(wzs)!=-1)
 86         {
 87         x=tmp.substr(0,tmp.find(wzs));
 88         if (x=="") x="1";
 89         y=tmp.substr(tmp.find(wzs),tmp.size()-tmp.find(wzs)+1);
 90         //cout<<x<<" "<<y<<endl;
 91         stringstream trans;
 92         trans<<x;
 93         int ans;
 94         trans>>ans;    
 95         weizhi-=ans;    
 96         }
 97         else 
 98         {
 99         stringstream trans;
100         trans<<tmp;
101         int ans;
102         trans>>ans;    
103         //cout<<ans<<endl;
104         num+=ans;
105         }
106         i=j;
107         }
108         if (b[i-1]=='-')
109         {
110          for (j=i;j<=b.size();j++) if (b[j+1]=='-'||b[j+1]=='+') break;
111          string tmp=b.substr(i,j-i+1);
112          //cout<<tmp<<endl;
113         if ((int)tmp.find(wzs)!=-1)
114         {
115         x=tmp.substr(0,tmp.find(wzs));
116         if (x=="") x="1";
117         y=tmp.substr(tmp.find(wzs),tmp.size()-tmp.find(wzs)+1);
118         //cout<<x<<" "<<y<<endl;
119         stringstream trans;
120         trans<<x;
121         int ans;
122         trans>>ans;    
123         weizhi+=ans;
124         }
125         else 
126         {
127         stringstream trans;
128         trans<<tmp;
129         int ans;
130         trans>>ans;    
131         //cout<<ans<<endl;
132         num-=ans;    
133         }
134          i=j;    
135         }
136     }
137     cout<<wzs<<"=";
138     if ((double)num/weizhi==-0.000) cout<<"0.000"<<endl;
139     else printf("%.3lf",(double)num/weizhi);
140     //cout<<weizhi<<" "<<num<<endl;
141     return 0;
142 }