记录编号 |
27840 |
评测结果 |
AAAAA |
题目名称 |
[NOIP 2000PJ]计算器的改良 |
最终得分 |
100 |
用户昵称 |
Makazeu |
是否通过 |
通过 |
代码语言 |
C++ |
运行时间 |
0.015 s |
提交时间 |
2011-10-08 18:21:24 |
内存使用 |
0.27 MiB |
显示代码纯文本
//NOIP2000 普及組:計算器的改良
#include <fstream>
#include <iomanip>
#include <cstring>
using namespace std;
ifstream fin("computer.in");
ofstream fout("computer.out");
char righter[100];
char lefter[100];
int lenr=0,lenl=0;
char X; //未知数X
double con=0,unk=0;
void init()
{
bool GetX=true;
char c;
fin>>c;
while (c!='=')
{
if (GetX && islower(c))
{
X=c;
GetX=false;
}
lefter[lenl]=c;
lenl++;
fin>>c;
}
//fout<<lefter<<" "<<lenl<<endl;
fin>>c;
while (!fin.eof())
{
if (GetX && islower(c))
{
X=c;
GetX=false;
}
righter[lenr]=c;
lenr++;
fin>>c;
}
//fout<<righter<<endl<<lenr<<endl;
}
int GetNumLen(char *str,int place,int len)
{//測試字符串中從某點開始數字字符持續的長度
int l=0;
for (int i=place;i<len;i++)
{
if (isdigit(str[i]))
l++;
else return l;
}
return l;
}
int myatoi(char *str)
{
int ret=0;
int sign=1;
if(*str=='-')
sign=-1;
else
ret=ret*10+(*str-'0');
str++;
while(*str!= '\0')
{
ret=ret*10+(*str-'0');
str++;
}
return sign*ret;
}
void scanl(char *str,int L)
{
int now=0;
if(str[now]=='-')
{
now++;
if(now==L) return;
if (str[now]==X)
{
unk-=1;
now++;
if(now==L) return;
}
if ( isdigit(str[now]) )
{
int len=GetNumLen(str,now,L);
char temp2[102];
memset(temp2,'\0',sizeof(temp2));
for (int i=0;i<len;i++)
{
temp2[i]=str[i+now];
}
now+=len;
if (str[now]!=X) con+=myatoi(temp2);
else
{
unk-=myatoi(temp2);
now++;
}
}
}
else
{
if (str[now]==X)
{
unk+=1;
now++;
if(now==L) return;
}
if ( isdigit(str[now]) )
{
int len=GetNumLen(str,now,L);
char temp[102];
memset(temp,'\0',sizeof(temp));
for (int i=0;i<len;i++)
{
temp[i]=str[i+now];
}
now+=len;
if (str[now]!=X) con-=myatoi(temp);
else
{
unk+=myatoi(temp);
now++;
}
}
}
while(now<L)
{
if(str[now]=='-')
{
now++;
if (str[now]==X)
{
unk-=1;
now++;
if(now==L) break;
}
if ( isdigit(str[now]) )
{
int len=GetNumLen(str,now,L);
char temp[102];
memset(temp,'\0',sizeof(temp));
for (int i=0;i<len;i++)
{
temp[i]=str[i+now];
}
now+=len;
if (str[now]!=X) con+=myatoi(temp);
else
{
unk-=myatoi(temp);
now++;
}
}
}
if(str[now]=='+')
{
now++;
if (str[now]==X)
{
unk+=1;
now++;
if(now==L) break;
}
if ( isdigit(str[now]) )
{
int len=GetNumLen(str,now,L);
char temp[102];
memset(temp,'\0',sizeof(temp));
for (int i=0;i<len;i++)
{
temp[i]=str[i+now];
}
now+=len;
if (str[now]!=X) con-=myatoi(temp);
else
{
unk+=myatoi(temp);
now++;
}
}
}
}
}
void scanr(char *str,int L)
{
int now=0;
if(str[now]=='-')
{
now++;
if(now==L) return;
if (str[now]==X)
{
unk+=1;
now++;
if(now==L) return;
}
if ( isdigit(str[now]) )
{
int len=GetNumLen(str,now,L);
char temp2[102];
memset(temp2,'\0',sizeof(temp2));
for (int i=0;i<len;i++)
{
temp2[i]=str[i+now];
}
now+=len;
if (str[now]!=X) con-=myatoi(temp2);
else
{
unk+=myatoi(temp2);
now++;
}
}
}
else
{
if (str[now]==X)
{
unk-=1;
now++;
if(now==L) return;
}
if ( isdigit(str[now]) )
{
int len=GetNumLen(str,now,L);
char temp[102];
memset(temp,'\0',sizeof(temp));
for (int i=0;i<len;i++)
{
temp[i]=str[i+now];
}
now+=len;
if (str[now]!=X) con+=myatoi(temp);
else
{
unk-=myatoi(temp);
now++;
}
}
}
while(now<L)
{
if(str[now]=='-')
{
now++;
if (str[now]==X)
{
unk-=1;
now++;
if(now==L) break;
}
if ( isdigit(str[now]) )
{
int len=GetNumLen(str,now,L);
char temp[102];
memset(temp,'\0',sizeof(temp));
for (int i=0;i<len;i++)
{
temp[i]=str[i+now];
}
now+=len;
if (str[now]!=X) con-=myatoi(temp);
else
{
unk+=myatoi(temp);
now++;
}
}
}
if(str[now]=='+')
{
now++;
if (str[now]==X)
{
unk-=1;
now++;
if(now==L) break;
}
if ( isdigit(str[now]) )
{
int len=GetNumLen(str,now,L);
char temp[102];
memset(temp,'\0',sizeof(temp));
for (int i=0;i<len;i++)
{
temp[i]=str[i+now];
}
now+=len;
if (str[now]!=X) con+=myatoi(temp);
else
{
unk-=myatoi(temp);
now++;
}
}
}
}
}
int main()
{
init();
scanl(lefter,lenl);
scanr(righter,lenr);
//fout<<unk<<" "<<con<<endl;
//fout<<con/unk<<endl;
float result;
result=con/unk;
if (result>-0.0005 && result<=0) result=0;
fout<<X<<"="<<setiosflags(ios::fixed)<<setprecision(3)<<result<<endl;
return 0;
}