华师一附中OI组
标题:
P1022 计算器的改良
[打印本页]
作者:
admin
时间:
2018-6-29 16:39
标题:
P1022 计算器的改良
https://www.luogu.org/problemnew/show/P1022
题目背景
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
作者:
倚窗倾听风吹雨
时间:
2018-7-10 13:41
#include<iostream>
#include <iomanip>
using namespace std;
string s;
char z;
int i,j,m,n,p[100],q;
double a,b,k,h,ans;
int main()
{
cin>>s;
s=' '+s+' ';
while(s[n]!='=')
n++;
while(s[i]>'z'||s[i]<'a')
i++;z=s[i];
for(i=0; i<s.size(); i++)
if(s[i]=='+'||s[i]=='-'||s[i]=='=')
p[++q]=i;p[++q]=s.size()-1;
for(i=0;i<=q;i++)
{
if(s[p[i]-1]==z)
{
for(j=p[i-1]+1;j<p[i]-1;j++)
a=a*10+(s[j]-'0');j--;
if(a==0)a=1;
if(s[p[i-1]]=='-')a=-1*a;
if(j<n)b=b+a;
else b=b-a;
a=0;
}
else
{
for(j=p[i-1]+1;j<p[i];j++)
k=k*10+(s[j]-'0');j--;
if(s[p[i-1]]=='-')k=-1*k;
if(j<n)h=h-k;
else h=h+k;
k=0;
}
}
ans=h/b;///cout<<h<<" "<<b<<endl;
if(ans==0)ans=0;
cout<<z<<"="<<fixed<<setprecision(3)<<ans;
return 0;
}
复制代码
作者:
吴语林
时间:
2018-7-29 20:26
#include<cstdio>
#include<cstring>
int main()
{
char c,s[505];
int x=0,y=0,a=0,f=1,f1=1,i;
double ans;
scanf("%s",s);
for (i=0;i<strlen(s);i++)
{
if (s[i]>='0'&&s[i]<='9') a=a*10+s[i]-48;
if (s[i]=='-')
{
y+=-1*f*f1*a;
f=-1;
a=0;
}
if (s[i]=='+')
{
y+=-1*f*f1*a;
f=1;
a=0;
}
if (s[i]=='=')
{
y+=-1*f*f1*a;
f1=-1;
f=1;
a=0;
}
if (s[i]>='a'&&s[i]<='z')
{
c=s[i];
if (a) x+=f*a*f1; else x+=f*f1;
f=1;
a=0;
}
}
y+=-1*f*f1*a;
ans=1.0*y/x;
if (ans<=0.000&&ans>-0.0005) printf("%c=0.000",c);
else printf("%c=%.3lf",c,ans);
return 0;
}
复制代码
作者:
walk_alone
时间:
2018-8-1 20:26
#include <cstdio>
int main()
{
char c,x;
long long th=0,sign=1,judge=0,front=0,value=0,flag=1;
scanf("%c",&c);
while(1)
{
if(c>=97 && c<=122)
{
x=c;
if(th==0 && !judge)
{
front+=flag*sign;
judge=0;
}
else
{
front+=flag*sign*th;
th=0;
sign=1;
judge=0;
}
}
else if(c=='-')
{
value+=-flag*sign*th;
th=0;
sign=-1;
judge=0;
}
else if(c=='+')
{
value+=-flag*sign*th;
th=0;
sign=1;
judge=0;
}
else if(c>='0' && c<='9')
{
th=th*10+c-48;
judge=1;
}
else if(c=='=')
{
value+=-flag*sign*th;
th=0;
sign=1;
flag=-flag;
judge=0;
}
else
{
value+=-flag*sign*th;
break;
}
scanf("%c",&c);
}
double ans=double(value)/front;
if(ans==-0)
ans=0;
printf("%c=%.3lf",x,ans);
return 0;
}
复制代码
作者:
黄煦喆
时间:
2018-8-2 09:56
#4:WA
#include<iostream>
#include<iomanip>
#include<string>
using namespace std;
string s;
int a=1,b,sl,sr,k;
double eps=1e-5;
char ch;
int main()
{
cin>>s;
while(k<s.size())
{
if(!(s[k]>='0'&&s[k]<='9')&&s[k+1]>='a'&&s[k+1]<='z')
s=s.substr(0,k+1)+'1'+s.substr(k+1);
else if(k==0&&s[k]>='a'&&s[k]<'z')s='1'+s;
k++;
}
int mid=s.find('=');
int l=0,r=mid+1,len=s.size();
while(l<mid)
{
if(s[l]=='-')a=0-a,l++;
while(s[l]>='0'&&s[l]<='9')
{
b=b*10+(s[l]-'0');
l++;
}
if(s[l]>='a'&&s[l]<='z')
{
sl+=a*b;
ch=s[l];
b=0,l++;
}
else
{
sr-=a*b;
b=0;
if(s[l]=='-')a=-1;
else if(s[l]=='+')a=1;
l++;
}
}
a=1,b=0;
while(r<=len)
{
if(s[r]=='-')a=0-a,r++;
while(s[r]>='0'&&s[r]<='9')
{
b=b*10+(s[r]-'0');
r++;
}
if(s[r]>='a'&&s[r]<='z')
{
sl-=a*b;
ch=s[r],b=0;
r++;
}
else
{
sr+=a*b;
b=0;
if(s[r]=='-')a=-1;
else if(s[r]=='+')a=1;
r++;
}
}
double ans=sr*1.0/double(sl);
cout<<ch<<'=';
if(ans>-eps&&ans<eps)cout<<"0.000";
else cout<<fixed<<setprecision(3)<<ans;
return 0;
}
复制代码
欢迎光临 华师一附中OI组 (http://hsyit.cn/)
Powered by Discuz! X3.2