华师一附中OI组

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1521|回复: 4
打印 上一主题 下一主题

P1022 计算器的改良

[复制链接]

738

主题

1485

帖子

5422

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
5422
跳转到指定楼层
楼主
发表于 2018-6-29 16:39:52 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
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
回复

使用道具 举报

9

主题

158

帖子

470

积分

华一学生

积分
470
QQ
5#
发表于 2018-8-2 09:56:17 | 只看该作者
  #4:WA
  1. #include<iostream>
  2. #include<iomanip>
  3. #include<string>
  4. using namespace std;
  5. string s;
  6. int a=1,b,sl,sr,k;
  7. double eps=1e-5;
  8. char ch;
  9. int main()
  10. {
  11.     cin>>s;
  12.     while(k<s.size())
  13.     {
  14.         if(!(s[k]>='0'&&s[k]<='9')&&s[k+1]>='a'&&s[k+1]<='z')
  15.             s=s.substr(0,k+1)+'1'+s.substr(k+1);
  16.         else if(k==0&&s[k]>='a'&&s[k]<'z')s='1'+s;
  17.         k++;
  18.     }
  19.     int mid=s.find('=');
  20.     int l=0,r=mid+1,len=s.size();
  21.     while(l<mid)
  22.     {
  23.         if(s[l]=='-')a=0-a,l++;
  24.         while(s[l]>='0'&&s[l]<='9')
  25.         {
  26.             b=b*10+(s[l]-'0');
  27.             l++;
  28.         }
  29.         if(s[l]>='a'&&s[l]<='z')
  30.         {
  31.             sl+=a*b;
  32.             ch=s[l];
  33.             b=0,l++;
  34.         }
  35.         else
  36.         {
  37.             sr-=a*b;
  38.             b=0;
  39.             if(s[l]=='-')a=-1;
  40.             else if(s[l]=='+')a=1;
  41.             l++;
  42.         }
  43.     }
  44.     a=1,b=0;
  45.     while(r<=len)
  46.     {
  47.         if(s[r]=='-')a=0-a,r++;
  48.         while(s[r]>='0'&&s[r]<='9')
  49.         {
  50.             b=b*10+(s[r]-'0');
  51.             r++;
  52.         }
  53.         if(s[r]>='a'&&s[r]<='z')
  54.         {
  55.             sl-=a*b;
  56.             ch=s[r],b=0;
  57.             r++;
  58.         }
  59.         else
  60.         {
  61.             sr+=a*b;
  62.             b=0;
  63.             if(s[r]=='-')a=-1;
  64.             else if(s[r]=='+')a=1;
  65.             r++;
  66.         }
  67.     }
  68.     double ans=sr*1.0/double(sl);
  69.     cout<<ch<<'=';
  70.     if(ans>-eps&&ans<eps)cout<<"0.000";
  71.     else cout<<fixed<<setprecision(3)<<ans;
  72.     return 0;
  73. }
复制代码
回复 支持 反对

使用道具 举报

0

主题

30

帖子

91

积分

注册会员

Rank: 2

积分
91
地板
发表于 2018-8-1 20:26:33 | 只看该作者
  1. #include <cstdio>
  2. int main()
  3. {
  4.     char c,x;
  5.     long long th=0,sign=1,judge=0,front=0,value=0,flag=1;
  6.         scanf("%c",&c);
  7.     while(1)
  8.         {
  9.         if(c>=97 && c<=122)
  10.                 {
  11.             x=c;
  12.                         if(th==0 && !judge)
  13.                         {
  14.                                 front+=flag*sign;
  15.                                 judge=0;
  16.                         }
  17.             else
  18.                         {
  19.                                 front+=flag*sign*th;
  20.                                 th=0;
  21.                                 sign=1;
  22.                                 judge=0;
  23.                         }
  24.         }
  25.         else if(c=='-')
  26.                 {
  27.                         value+=-flag*sign*th;
  28.                         th=0;
  29.                         sign=-1;
  30.                         judge=0;
  31.                 }       
  32.         else if(c=='+')
  33.                 {
  34.                         value+=-flag*sign*th;
  35.                         th=0;
  36.                         sign=1;
  37.                         judge=0;
  38.                 }
  39.         else if(c>='0' && c<='9')
  40.                 {
  41.                         th=th*10+c-48;
  42.                         judge=1;
  43.                 }
  44.         else if(c=='=')
  45.                 {
  46.                         value+=-flag*sign*th;
  47.                         th=0;
  48.                         sign=1;
  49.                         flag=-flag;
  50.                         judge=0;
  51.                 }
  52.         else
  53.                 {
  54.                         value+=-flag*sign*th;
  55.                         break;
  56.                 }
  57.         scanf("%c",&c);
  58.     }
  59.     double ans=double(value)/front;
  60.         if(ans==-0)
  61.                 ans=0;
  62.     printf("%c=%.3lf",x,ans);
  63.     return 0;
  64. }
复制代码
回复 支持 反对

使用道具 举报

2

主题

105

帖子

306

积分

中级会员

Rank: 3Rank: 3

积分
306
板凳
发表于 2018-7-29 20:26:27 | 只看该作者
  1. #include<cstdio>
  2. #include<cstring>
  3. int main()
  4. {
  5.     char c,s[505];
  6.     int x=0,y=0,a=0,f=1,f1=1,i;
  7.     double ans;
  8.     scanf("%s",s);
  9.     for (i=0;i<strlen(s);i++)
  10.     {
  11.         if (s[i]>='0'&&s[i]<='9') a=a*10+s[i]-48;
  12.         if (s[i]=='-')
  13.         {
  14.             y+=-1*f*f1*a;
  15.             f=-1;
  16.             a=0;
  17.         }
  18.         if (s[i]=='+')
  19.         {
  20.             y+=-1*f*f1*a;
  21.             f=1;
  22.             a=0;
  23.         }
  24.         if (s[i]=='=')
  25.         {
  26.             y+=-1*f*f1*a;
  27.             f1=-1;
  28.             f=1;
  29.             a=0;
  30.         }
  31.         if (s[i]>='a'&&s[i]<='z')
  32.         {
  33.             c=s[i];
  34.             if (a) x+=f*a*f1; else x+=f*f1;
  35.             f=1;
  36.             a=0;
  37.         }
  38.     }
  39.     y+=-1*f*f1*a;
  40.     ans=1.0*y/x;
  41.     if (ans<=0.000&&ans>-0.0005) printf("%c=0.000",c);
  42.     else printf("%c=%.3lf",c,ans);
  43.     return 0;
  44. }
复制代码
回复 支持 反对

使用道具 举报

50

主题

215

帖子

619

积分

高级会员

Rank: 4

积分
619
沙发
发表于 2018-7-10 13:41:05 | 只看该作者
  1. #include<iostream>
  2. #include <iomanip>
  3. using namespace std;
  4. string s;
  5. char z;
  6. int i,j,m,n,p[100],q;
  7. double a,b,k,h,ans;
  8. int main()
  9. {
  10.     cin>>s;
  11.     s=' '+s+' ';
  12.     while(s[n]!='=')
  13.         n++;
  14.     while(s[i]>'z'||s[i]<'a')
  15.         i++;z=s[i];
  16.     for(i=0; i<s.size(); i++)
  17.     if(s[i]=='+'||s[i]=='-'||s[i]=='=')
  18.     p[++q]=i;p[++q]=s.size()-1;
  19.     for(i=0;i<=q;i++)
  20.     {
  21.         if(s[p[i]-1]==z)
  22.         {
  23.             for(j=p[i-1]+1;j<p[i]-1;j++)
  24.                 a=a*10+(s[j]-'0');j--;
  25.             if(a==0)a=1;
  26.             if(s[p[i-1]]=='-')a=-1*a;
  27.             if(j<n)b=b+a;
  28.             else b=b-a;
  29.             a=0;
  30.         }
  31.         else
  32.         {
  33.             for(j=p[i-1]+1;j<p[i];j++)
  34.                 k=k*10+(s[j]-'0');j--;
  35.             if(s[p[i-1]]=='-')k=-1*k;
  36.             if(j<n)h=h-k;
  37.             else h=h+k;
  38.             k=0;
  39.         }
  40.     }
  41.     ans=h/b;///cout<<h<<" "<<b<<endl;
  42.     if(ans==0)ans=0;
  43.     cout<<z<<"="<<fixed<<setprecision(3)<<ans;
  44.     return 0;
  45. }
复制代码
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|服务支持:DZ动力|华师一附中OI组  

GMT+8, 2024-12-25 01:51 , Processed in 0.107523 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表