think: 1题目将基础的求最大公约数和最小公倍数的知识深层次展现,题目让N个数求和,而这N个数以分数形式输入,将分数加减法和求最小公倍数知识相融合,将分母的约分化简则巧妙融合求最大公约数的知识,还有输出情况的多样性,更需要细心和心态平和
5-1 N个数求和 (20分) 本题的要求很简单,就是求N个数字的和。麻烦的是,这些数字是以有理数分子/分母的形式给出的,你输出的和也必须是有理数的形式。
输入格式: 输入第一行给出一个正整数N(≤/le≤100)。随后一行按格式a1/b1 a2/b2 …给出N个有理数。题目保证所有分子和分母都在长整型范围内。另外,负数的符号一定出现在分子前面。
输出格式: 输出上述数字和的最简形式 —— 即将结果写成整数部分 分数部分,其中分数部分写成分子/分母,要求分子小于分母,且它们没有公因子。如果结果的整数部分为0,则只输出分数部分。
输入样例1: 5 2/5 4/15 1/30 -2/60 8/3 输出样例1: 3 1/3
输入样例2: 2 4/3 2/3 输出样例2: 2
输入样例3: 3 1/3 -1/6 1/8 输出样例3: 7/24
hint: 2017-02-21 16:26 答案正确 20 5-1 gcc 14 1 16110501070 测试点结果 测试点 结果 得分/满分 用时(ms) 内存(MB) 要点提示 测试点1 答案正确 4/4 2 1 sample 1 和要约简,有负数,有整数部分 测试点2 答案正确 4/4 14 1 sample 2 输出整数 测试点3 答案正确 4/4 2 1 sample 3 只有分数部分 测试点4 答案正确 3/3 2 1 若不随时化简,则会溢出;输出为负数 测试点5 答案正确 3/3 5 1 输出负整数 测试点6 答案正确 2/2 5 1 最大N,结果为0
以下为accepted代码
#include <stdio.h>#include <string.h>struct node{ long long fz; long long fm;}fs[104], ans;long long ys(long long n, long long m)//求最大公约数{ long long t, r; if(n < m) { t = n; n = m; m = t; } while(m) { r = n%m; n = m; m = r; } return n;}long long bs(long long n, long long m)//求最小公倍数{ long long x = ys(n, m); long long t = (n*m); return t/x;}int main(){ int N, i; long long x, y, z, sum; scanf("%d", &N); for(i = 0; i < N; i++) { scanf("%lld/%lld", &fs[i].fz, &fs[i].fm); } ans.fm = 1, ans.fz = 0, sum = 0; for(i = 0; i < N; i++) { x = bs(ans.fm, fs[i].fm);//求累加记录的结构体变量的分母和新的累加数的结构体变量的分母的最小公倍数 y = ans.fz*(x/ans.fm) + fs[i].fz*(x/fs[i].fm);//求分子进行加减法操作结果 ans.fm = x;//分母更新 ans.fz = y;//分子更新 sum += ans.fz/ans.fm;//整数部分 ans.fz = ans.fz%ans.fm;//分数部分分子更新 z = ys(ans.fz, ans.fm);//化简 ans.fz /= z;//化简 ans.fm /= z;//化简 } if(ans.fz != 0 && sum != 0) PRintf("%lld %lld/%lld/n", sum, ans.fz, ans.fm); if(ans.fz == 0 && sum != 0) printf("%lld/n", sum); if(ans.fz != 0 && sum == 0) printf("%lld/%lld/n", ans.fz, ans.fm); if(ans.fz == 0 && sum == 0) printf("0/n"); return 0;}新闻热点
疑难解答