资源限制
内存限制:256.0MB C/C++时间限制:1.0s Java时间限制:3.0s Python时间限制:5.0s
问题描述
令二元函数f(x,y)=ax+by,a和b为整数,求一个表达式S的值。
只有满足以下要求的表达式才是合法的:
1.任意整数x是一个合法的表达式;
2.如果A和B都是合法的表达式,则f(A,B)也是一个合法的表达式。
输入格式
第一行两个数a和b;
第二行一个字符串S表示要求的表达式。
输出格式
一行一个数表示表达式S的值。
样例输入
1 2
f(1,f(1,-1))
样例输出
-1
数据规模和约定
S的长度不超过50,运算过程中所有变量不会超出int的范围。
AC:
#include<stdio.h>
#include<stack>//使用栈的头文件
#include<cctype>//判断是否是数字的头文件
using namespace std;//将所有变量名字储存在std这个空间里,避免和系统变量名发生冲突
int a,b,temp;
char str[50];
int f(int x,int y)//二元函数
{
return a*x+b*y;
}
int getNumber(int i,bool m)//i是当前下标,m用于判断是否为负数
{
int num=0;
for(;isdigit(str[i]);i++)//判断是否为数字
{
num=num*10+str[i]-'0';//从最高位开始往后加
}
temp=i;//数字存完之后i要跳到后面
if(m)//判断是否为负数
{
num=-num;
}
return num;
}
int main()
{
scanf("%d%d\n",&a,&b);
gets(str);
stack<int> num;//创建一个栈用来储存x和y
num.push(0);//先初始化
for(int i=0;i<50;i++)
{
if(str[i]=='-')
{
i++;
num.push(getNumber(i,true));//true表示是负数,让负号和后面的数字进栈
i=temp;
}
else if(isdigit(str[i]))
{
num.push(getNumber(i,false));//正数进栈
i=temp;
}
if(str[i]==')')//当一次函数的xy已经都进栈后需要调用二次函数
{
int y=num.top();
num.pop();
int x=num.top();
num.pop();
num.push(f(x,y));//把结果输入进栈作为下一次函数的参数
}
}
printf("%d",num.top());
return 0;
}
ps:测评语言换成c++,不然会报错说找不到stack这个头文件