藍橋杯試題 算法訓練 二元函數
題目描述:
資源限制
時間限制:1.0s 內存限制:256.0MB
問題描述
令二元函數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<iostream>
#include<stack>
#include<cctype>
using namespace std;
int a,b,temp;//temp爲中間變量,爲了給i賦值用的
string s;
int f(int x,int y)
{
return a*x+b*y;
}
int getNumber(int i,bool m)
{//讀取數字
int num=0;
for(;isdigit(s[i]);i++)//isdigit函數,主要用於檢查其參數是否爲十進制數字字符
{//從高位開始
num=num*10+s[i]-'0';
}
temp=i;//將遍歷到的索引位置(i)的值存儲下來
if(m)
{
num=-num;//負數
}
return num;
}
//f(1,f(1,-1))
int main()
{
cin>>a>>b>>s;
stack<int> num;
num.push(0);//防止空串
for(int i=0;i<s.length();i++)
{
if(s[i]=='-')
{
i++;
// cout<<getNumber(i,true)<<endl;
num.push(getNumber(i,true));//讓"-"後面的數字進棧 (其實就是負數進棧)
i=temp;
}
else if(isdigit(s[i]))
{
num.push(getNumber(i,false));//讓不是 "-"後面的數字進棧 (其實就是非負數進棧)
i=temp;
}
if(s[i]==')')
{
int y=num.top();//注意順序
num.pop();
int x=num.top();
num.pop();
num.push(f(x,y));
}
}
cout<<num.top()<<endl;
return 0;
}