zoukankan      html  css  js  c++  java
  • 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
    ", decimal);
            else
                printf("%lld/%lld
    ", decimal, denominator);
        }
    
        return 0;
    }



  • 相关阅读:
    非数字验证(Javascript)
    JavaScript 调用WSS
    定制列表编辑页面
    sharepoint 页面定制经验小结
    div 滚动条样式大集合
    char、varchar、text和nchar、nvarchar、ntext的区别
    javascript去处空格
    ADHelper类与扩展应用
    【转】ASP.NET页面刷新方法大集合
    MOSS2007删除失败的SSP ?
  • 原文地址:https://www.cnblogs.com/tigerisland/p/7563874.html
Copyright © 2011-2022 走看看