您的位置:首页 > 其它

CODE 1015 计算器的改良

2014-12-05 16:31 169 查看
http://codevs.cn/problem/1015/

题意是求解一个一元一次方程组,只包含小写字母,数字,+,—,= 。求出最后的解即可。负号还可以做减号。

我是用x保存变量前的系数,y保存整数的结果,等于放到等式一边来考虑。

#include <cstdio>
#include <cstring>

int main()
{
//freopen("a.txt","r",stdin);
char s[100];
char c;
double x=0,y=0,ans=0,flag=1;  //ans存储当前数值 ,flag表示在等式左边还是右边,x表示变量的大小,y表示整数的结果
int cnt=1; //cnt表示当前的数正还是负
scanf("%s",s);
int len=strlen(s);
if(s[0]=='-') cnt=-1; //判断第一个字符
else if(s[0]>='a'&&s[0]<='z') { x+=1; c=s[0];} //是字母的话
else ans=ans*10+s[0]-'0';  //是数字
for(int i=1;i<len;i++)
{
// printf("%.2lf %d %.2lf %.2lf\n",ans,cnt,x,y);
if(s[i]>='a'&&s[i]<='z')  //是字母就把 ans的值加到x里面去 同时c表示变量是哪个字母
{
c=s[i];
x+=cnt*flag*ans;
ans=0;
cnt=1;
}
else if(s[i]>='0'&&s[i]<='9')
{
ans=ans*10+s[i]-'0';
}
else
{
if(ans)  //数字加到y上面去
{
y+=cnt*flag*ans;
ans=0;cnt=1;
}
if(s[i]=='-') cnt=-1;
else if(s[i]=='+') cnt=1;
else if(s[i]=='=') flag=-1;
}
}
if(s[len-1]>='0'&&s[len-1]<='9') y+=cnt*flag*ans; //还要注意最后是整数的情况没有处理
// printf("%.2lf\n",ans);
//printf("%.2lf %.2lf\n",x,y);
ans=y/x; //还有等于0的情况
if(ans==0) printf("0.000\n");
else
printf("%c=%.3lf\n",c,-1*y/x);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: