#include<stack> #include<cstring> #include<vector> #include<algorithm> #include<cstdio> #include<cstdlib> using namespace std; int main() { string s = ""; vector<string>ssd; stack<double>stl; int i, j, k; while (cin >> s) { ssd.push_back(s); if (cin.get() == '\n') break; } reverse(ssd.begin(), ssd.end()); for (i = 0; i < ssd.size(); i++) { if (ssd[i] == "+") { double s1 = stl.top(); stl.pop(); double s2 = stl.top(); stl.pop(); stl.push(s1 + s2); } else if (ssd[i] == "-") { double s1 = stl.top(); stl.pop(); double s2 = stl.top(); stl.pop(); stl.push(s1 - s2); } else if (ssd[i] == "*") { double s1 = stl.top(); stl.pop(); double s2 = stl.top(); stl.pop(); stl.push(s1 * s2); } else if (ssd[i] == "/") { double s1 = stl.top(); stl.pop(); double s2 = stl.top(); stl.pop(); stl.push(s1 / s2); } else { char str[10] = { '0' }; for (j = 0; j < ssd[i].size(); j++) { str[j] = ssd[i][j]; } stl.push(atof(str)); } } printf("%.6lf",stl.top()); }
说一个有关自增和自减的坑。我写的代码有一句曾经是这样的:
x+=(s[i--]-'0') * Pow10(j-i);
其中Pow10是一个算10的x次方的函数。我在本地运行的结果也是和下面的代码等同的:
x+=(s[i]-'0') * Pow10(j-i); i--;
因为没有出问题,所以我也就忽略了这行代码。结果到OJ上,这行代码的运行结果是和这段代码等同的:
x+=(s[i]-'0') * Pow10(j-(i-1)); i--;
我才发现后置自减运算符在不同的环境下居然得到的结果是不同的…… 当然,前置自增自减是没有这种问题的……
样例中减号和5中间没有空格
我看成了负号,调试到心态爆炸
输出必须保留6位小数,然而题干里没说,只在输出样例里暗示了一下……
int main() { char s[200]; gets(s); double a[200]; int count=0; for (int i=strlen(s)-1;i>=0;i–) { if (s[i]>=‘0’&&s[i]<=‘9’&&s[i-1]==’ ‘) a[count++]=s[i]-‘0’; else if (s[i]>=‘0’&&s[i]<=‘9’&&s[i-1]!=’ ‘) { char b[10]; int count2=0,flag=0; b[count2++]=s[i–]; while(s[i]!=’ ‘) { if(s[i]==’.’)flag=1; b[count2++]=s[i–]; } if(flag) { double x=0; int y=0,j,k; for (j=0;b[j]!=’.’;j++) x=0.1x+(b[j]-‘0’)0.1; for(k=count2-1;k>j;k–) y=y10+b[k]-‘0’; a[count++]=y+x; } else { int y=0; for (int k=count2-1;k>=0;k–) { y=y10+b[k]-‘0’; } a[count++]=y; } } else if (s[i]==’’) { a[count-2]=a[count-1]a[count-2]; count–; } else if (s[i]==’/’) { a[count-2]=a[count-1]/a[count-2]; count–; } else if (s[i]==’+’) { a[count-2]=a[count-1]+a[count-2]; count–; } else if (s[i]==’-‘) { a[count-2]=a[count-1]-a[count-2]; count–; } } printf(“%.6f”,a[0]); return 0; }
include
说一个有关自增和自减的坑。我写的代码有一句曾经是这样的:
其中Pow10是一个算10的x次方的函数。我在本地运行的结果也是和下面的代码等同的:
因为没有出问题,所以我也就忽略了这行代码。结果到OJ上,这行代码的运行结果是和这段代码等同的:
我才发现后置自减运算符在不同的环境下居然得到的结果是不同的……
当然,前置自增自减是没有这种问题的……
样例中减号和5中间没有空格
我看成了负号,调试到心态爆炸
输出必须保留6位小数,然而题干里没说,只在输出样例里暗示了一下……
include
include
include
int main()
{
char s[200];
gets(s);
double a[200];
int count=0;
for (int i=strlen(s)-1;i>=0;i–)
{
if (s[i]>=‘0’&&s[i]<=‘9’&&s[i-1]==’ ‘)
a[count++]=s[i]-‘0’;
else if (s[i]>=‘0’&&s[i]<=‘9’&&s[i-1]!=’ ‘)
{
char b[10];
int count2=0,flag=0;
b[count2++]=s[i–];
while(s[i]!=’ ‘)
{
if(s[i]==’.’)flag=1;
b[count2++]=s[i–];
}
if(flag)
{
double x=0;
int y=0,j,k;
for (j=0;b[j]!=’.’;j++)
x=0.1x+(b[j]-‘0’)0.1;
for(k=count2-1;k>j;k–)
y=y10+b[k]-‘0’;
a[count++]=y+x;
}
else
{
int y=0;
for (int k=count2-1;k>=0;k–)
{
y=y10+b[k]-‘0’;
}
a[count++]=y;
}
}
else if (s[i]==’’)
{
a[count-2]=a[count-1]a[count-2];
count–;
}
else if (s[i]==’/’)
{
a[count-2]=a[count-1]/a[count-2];
count–;
}
else if (s[i]==’+’)
{
a[count-2]=a[count-1]+a[count-2];
count–;
}
else if (s[i]==’-‘)
{
a[count-2]=a[count-1]-a[count-2];
count–;
}
}
printf(“%.6f”,a[0]);
return 0;
}