https://pintia.cn/problem-sets/994805342720868352/problems/994805386161274880

Given N rational numbers in the form "numerator/denominator", you are supposed to calculate their sum.

Input Specification:

Each input file contains one test case. Each case starts with a positive integer N (<=100), followed in the next line N rational numbers "a1/b1 a2/b2 ..." where all the numerators and denominators are in the range of "long int". If there is a negative number, then the sign must appear in front of the numerator.

Output Specification:

For each test case, output the sum in the simplest form "integer numerator/denominator" where "integer" is the integer part of the sum, "numerator" < "denominator", and the numerator and the denominator have no common factor. You must output only the fractional part if the integer part is 0.

Sample Input 1:

5
2/5 4/15 1/30 -2/60 8/3

Sample Output 1:

3 1/3

Sample Input 2:

2
4/3 2/3

Sample Output 2:

2

Sample Input 3:

3
1/3 -1/6 1/8

Sample Output 3:

7/24

代码:
#include <bits/stdc++.h>
using namespace std; long long a[111], b[111];
long long sum, m; long long gcd(long long x, long long y) {
long long z = x % y;
while(z) {
x = y;
y = z;
z = x % y;
}
return y;
} long long ad(long long x, long long y) {
if(x > y)
swap(x, y);
if(y % x == 0)
return y;
else
return x * y / gcd(x, y);
} void display(long long p, long long q) {
if(q == 0 || p == 0)
printf("0\n");
else {
bool flag = true;
if(p < 0) {
flag = false;
printf("-");
p = abs(p);
} if(p / q != 0) {
if(p % q == 0)
printf("%lld\n", p / q);
else {
long long mm = p / q;
printf("%lld ", mm);
if(!flag) cout << "-";
printf("%lld/%lld", (p - mm * q) / gcd(p - mm * q, q), q / gcd(p - mm * q, q));
}
} else {
printf("%lld/%lld", p / gcd(p, q), q / gcd(p, q));
} }
} void add(long long x, long long y) {
// sum / m + x / y
// = (sum * y + m * x) / (x * y);
long long xx = sum * y + m * x;
long long yy = m * y;
long long g = gcd(abs(xx), abs(yy));
xx /= g;
yy /= g;
sum = xx;
m = yy;
} int main() { int N;
scanf("%d", &N);
for(int i = 1; i <= N; i ++)
scanf("%lld/%lld", &a[i], &b[i]); if(N == 0) {
printf("0\n");
return 0;
}
if(N ==1) {
display(a[1], b[1]);
return 0;
} /*
long long m = ad(b[1], b[2]);
for(int i = 3; i <= N; i ++) {
m = ad(m, b[i]);
} long long sum = 0;
for(int i = 1; i <= N; i ++) {
sum += a[i] * m / b[i];
}
*/
sum = a[1];
m = b[1];
for(int i = 2; i <= N; i ++) {
add(a[i], b[i]);
} if(m < 0) {
sum = -sum;
m = -m;
}
display(sum, m); return 0;
}

  

最新文章

  1. Oculus安装问题
  2. web设计中那些因素可能影响网站后期优化
  3. 《oracle每天一练》Oracle之物化视图
  4. 图解 &amp; 深入浅出Java初始化与清理:构造器必知必会
  5. Java调用JavaScript
  6. NET Office 组件Spire
  7. sharepoint添加应用程序
  8. recurse_array_change_key_case()递规返回字符串键名全为小写或大写的数组
  9. Spark的任务处理流程
  10. SVN安装与使用
  11. Java Singleton 单例模式
  12. 如何在 Debian / Ubuntu 服务器上架设 L2TP / IPSec VPN
  13. mongodb 教程一
  14. Linux源文件夹结构呈现
  15. IOS学习之路(代码实现自动布局)
  16. C# RestoreDirectory
  17. HP服务器设置iLO步凑
  18. Linux /etc/password 文件详解
  19. go jwt OAuth2.0
  20. BOM-使用定时器

热门文章

  1. sqli-labs (less-8-less-10)
  2. 003.2---asyncio模块(上)
  3. Qt5.3.2 在MAC yosemite下编译出错 Could not resolve SDK path
  4. pyqt5 菜单,工具栏,线程,matplotlib
  5. STM32L476的RTC使用问题记录
  6. PHP基础知识试题
  7. [C++]C++得到最大的int值
  8. Python Web部署方式全汇总
  9. 如何使用Win+R快捷键打开自定义程序
  10. Git + Gerrit 操作备忘