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; }