CCF NOI1098 森林

问题链接CCF NOI1098 森林




时间限制: 1000 ms  空间限制: 262144 KB

题目描述 

  在很久很久之前,有一个很大很大的森林。森林里共有n棵奇怪的大树,每棵奇怪的大树上有一道数学式子,只有回答正确的运算答案才能开启到下一棵树的道路。
  斌斌在森林里玩了一天很开心,可在傍晚回家的时候,他被这些复杂的计算难倒了,你能帮帮他吗?斌斌一开始在第一棵树,他解答完n道题就可以走出森林了。
  式子的形式以“a (+-/*) b(+-/*) c(+-/*) d……=”的形式给出,严格按照从左到右的顺序计算即可(即乘除与加减同优先级),最后以最简分数的形式输出答案(a/b)(即a与b的最大公因数是1)

输入

  第1行为n。
  第2-n+1行,每行有一个字符串si,表示第i个题目。

输出

  n行,每行一个分数(a/b)的形式。

样例输入

2
5+6/7*3/9=
2+10/5-1=
样例输出

11/21
7/5

数据范围限制

  n<=500,si长度之和<=10000 保证答案分子分母<=10^9
  a,b,c,d<=1

提示

  关于输出格式问题:
  答案为0输出0
  答案为﹣输出-a/b的形式
  答案为+ 输出a/b的形式




问题分析

  这是一个分数四则运算问题

  需要知道分数计算的规则。

  为了约分需要计算最大公约数。

程序说明

  因为运算符没有优先级,计算式子从左到右迭代计算即可。

  数有可能比较大,所以使用long long类型。

要点详解

  • 尽量用函数封装功能函数



参考链接:(略)。

100分通过的C语言程序:

#include <stdio.h>
#include <stdlib.h>

long long gcd(long long m, long long n)
{
    if(n == 0)
        return m;
    else
        return gcd(n, m % n);
}

int main(void)
{
    int n, val;
    long long gcdval, decimal, denominator;
    char operate;

    scanf("%d", &n);
    while(n--) {
        decimal = 0;
        denominator = 1;

        operate = '+';

        for(;;) {
            scanf("%d", &val);
            if(operate == '+')
                decimal += val * denominator;
            else if(operate == '-')
                decimal -= val * denominator;
            else if(operate == '*')
                decimal *= val;
            else if(operate == '/')
                denominator *= val;

            if(decimal == 0)
                denominator = 1;
            else {
                gcdval = gcd(abs(decimal), abs(denominator));
                decimal /= gcdval;
                denominator /= gcdval;
            }

            scanf("%c", &operate);
            if(operate == '=')
                break;
        }

        if(decimal == 0)
            printf("%lld\n", decimal);
        else
            printf("%lld/%lld\n", decimal, denominator);
    }

    return 0;
}



posted on 2017-04-29 18:21  海岛Blog  阅读(293)  评论(0编辑  收藏  举报

导航