藍橋杯試題 算法訓練 二元函數

藍橋杯試題 算法訓練 二元函數

題目描述:

資源限制
時間限制: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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章