2013-06-13 07:28:53Morris

[UVA][遞迴] 11291 - Smeech

Problem B: Smeech

Professor Octastichs has invented a new programming language, Smeech. An expression in Smeech may be a positive or negative integer, or may be of the form (p e1 e2) where p is a real number between 0 and 1 (inclusive) and e1 and e2 are Smeech expressions. The value represented by a Smeech expression is as follows:
  • An integer represents itself
  • With probability p, (p e1 e2) represents x+y where x is the value of e1 and y is the value of e2; otherwise it represents x-y.
Given a Smeech expression, what is its expected value?

Input consists of several Smeech expressions, one per line, followed by a line containing (). For each expression, output its expected value to two decimal places.

Sample Input

7
(.5 3 9)
()

Output for Sample Input

7.00
3.00

Gordon V. Cormack

題目描述:

類似於 BNF 表示法。
<E[x]> -> <Integer> | (p <E[x]> <E[x]>)
<Integer> -> #number

然後他說有 p 的機率表示 x+y, 1-p 的機率表示 x-y
即 E[X] = p*(e1+e2) + (1-p)*(e1-e2)

題目解法:

使用遞迴去剖析字串會比較方便好寫。


#include <stdio.h>
#include <string.h>
char s[10000];
int i;
double sol() {
    if(s[i] != '(') {
        double e;
        sscanf(s+i, "%lf", &e);
        while((s[i] <= '9' && s[i] >= '0') || s[i] == '-')
            i++;
        while(s[i] == ' ')  i++;
        return e;
    }
    double p, e1, e2;
    sscanf(s+i, "(%lf", &p);
    while(s[i] != ' ')  i++;
    i++;
    e1 = sol();
    e2 = sol();
    while(s[i] != ')')  i++;
    i++;
    while(s[i] == ' ')  i++;
    return p*(e1+e2) + (1-p)*(e1-e2);
}
int main() {
    double p, e1, e2;
    while(gets(s)) {
        if(!strcmp(s, "()"))
            break;
        i = 0;
        printf("%.2lf\n", sol());
    }
    return 0;
}