当前位置: 移动技术网 > IT编程>开发语言>C/C++ > NOIP 2000 计算器的改良

NOIP 2000 计算器的改良

2018年09月23日  | 移动技术网IT编程  | 我要评论

穿越成陈阿娇,格拉斯哥流浪者,点石成金的故事

题面

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

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

4+3x=84+3x=8

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

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

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

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

输入输出格式

输入格式:

一个一元一次方程。

输出格式:

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

样例

6a-5+1=2-2a
输入
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 }

 

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网