问题链接: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;
}