Dr.Kong設計的機器人卡多掌握了加減法運算以後,最近又學會了一些簡單的函數求值,比如,它知道函數min(20,23)的值是20 ,add(10,98) 的值是108等等。經過訓練,Dr.Kong設計的機器人卡多甚至會計算一種嵌套的更復雜的表達式。
假設表達式可以簡單定義為:
1. 一個正的十進制數 x 是一個表達式。
2. 如果 x 和 y 是 表達式,則 函數min(x,y )也是表達式,其值為x,y 中的最小數。
3. 如果 x 和 y 是 表達式,則 函數max(x,y )也是表達式,其值為x,y 中的最大數。
4.如果 x 和 y 是 表達式,則 函數add(x,y )也是表達式,其值為x,y 之和。
例如, 表達式 max(add(1,2),7) 的值為 7。
請你編寫程序,對於給定的一組表達式,幫助 Dr.Kong 算出正確答案,以便校對卡多計算的正誤。
3 add(1,2) max(1,999) add(min(1,1000),add(100,99))
3 999 200
程序要用到函數sscanf()函數鏈接:http://www.cnblogs.com/lyq105/archive/2009/11/28/1612677.html
# include復制去Google翻譯翻譯結果# include # include int max(int a, int b) { if (a > b) return a; else return b; } int min(int a, int b) { if (a > b) return b; else return a; } char str[1000]; int start; int fun() { int num,len; switch(str[start]) { case'a': start += 3; return fun() +fun(); case'm': //當搜索到m是要判斷是max,還是min,然後遞歸進入相應的計算 start += 3; if (str[start-2] == 'a') return max(fun(),fun()); else return min(fun(),fun()); case'(': case')': case',': //遇到這些符號直接跳過 start ++; return fun(); default: sscanf(str+start,"%d%n",&num,&len); //這個是個函數鏈接如上;mun負責讀取整數,len負責讀取整數的長度(其實沒有整數,都是字符通過函數轉換而來的) start+= len; return num; } } int main(void) { int n; scanf("%d", &n); while (n--) { start = 0; scanf("%s", str); printf("%d\n", fun()); } return 0; }