今天我花了一个多小时才做完这题!!!呜呜呜!!!
我一看这题,开心,洛谷上做过的,赶紧去看. 结果,木有!!!AC!!!23333333333………………
于是我去找视频,发现正好有,结果老师说上一课讲了,于是我又去翻上一课@@@ 但,我可怜的WIFI断了!!!!23333333333…………
于是,我花了十几分钟重启电脑,没想到,我那亲爱的老爸又有邮件,于是我只能让他用电脑!!!! 不开心!!!!2333333333………………
这样,50多分钟过去了………………
当我坐下,敲了一遍代码,20几分钟过了,我在其他网站上刷了一遍,过了!!! 当我正要提交时,发现,那个网站的数据过了,但不一样!!!! 于是我只好请教小度!!!233333333333………………
我敲了一遍代码,记下了思路,运行成功!!!!!! 我一提交,错了!!! 呜呜呜呜………………我没打文件操作!!!!233333333333333333……………………………………
几秒过后,终于过了,我快哭了!!!!2333333333333333……………………
########################################################################################################################### //[就皮到这儿]
下面有思路 主要考字符串处理,把等式从等号中间断开,左边的区域为left,右边的区域为right。
开四个数组分别用来存储区域left和right中未知数的系数,区域left和right中的常数
先处理区域left,把区域left中含有未知数的数字和常数分别存储进数组,再处理区域right(字符串处理这里省略)
最后把存储区域left和right的未知数系数和常数的数组分别化简(合并同类项),进行平时解方程时候的模拟就好了
代码:
#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define ll long long
#define M(a) memset(a,0,sizeof a)
#define fo(i,j,k) for(i=j;i<=k;i++)
using namespace std;
const int mxn=1e6;
char s[1000005];
int num[1000005],cun[1000005];
char ch;
bool vis[1000005];
ll kl,kr;
ll al,ar;
int main()
{
freopen("comp.in","r",stdin);
freopen("comp.out","w",stdout);
int i,j,mid;
scanf("%s",s+1);
int len=strlen(s+1);
fo(i,1,len) if(s[i]<='z' && s[i]>='a') num[++num[0]]=i,ch=s[i];
fo(i,1,len) if(s[i]=='=') {mid=i;break;}
fo(i,1,num[0])
{
M(cun);int mul=1;
for(j=num[i]-1;s[j]>='0' && s[j]<='9';j--)
cun[++cun[0]]=s[j]-'0',vis[j]=1;
if(s[j]=='-') mul=-1;
ll tmp=0,po=1;
fo(j,1,cun[0]) tmp+=po*cun[j],po*=10;
if(num[i]<mid) al+=tmp*mul;
else ar+=tmp*mul;
}
fo(i,1,len)
if(!vis[i] && s[i]<='9' && s[i]>='0')
{
ll tmp=0;int mul=1;
if(s[i-1]=='-') mul=-1;
fo(j,i,len)
{
if(s[j]<'0' || s[j]>'9') break;
vis[j]=1;
tmp=tmp*10+s[j]-'0';
}
if(i<mid) kl+=tmp*mul;
else kr+=tmp*mul;
}
al-=ar,kr-=kl;
double ans=(double)kr/(double)al;
printf("%c=%.3lf\n",ch,ans);
return 0;
}
共 1 条回复
经本站长研究决定,授予你 刷题小能手的称号~