20200612-01 PAT 甲级试题 01 Rational Sum

怼烎@ 2023-02-17 05:04 116阅读 0赞

一、解析

1.1 核心算法

从题目来看,核心就是计算最大公因数,通过资料可知有两种方式能够计算出结果

方式一:辗转相除法 (欧几里德算法)
方式二:更相减损法 (《九章算术》的一种求最大公约数的算法)
方式三:辗转相减法 (尼考曼彻斯法)
这里由比较详细的图文解说,如果不是很清楚可以查看一下

1.2 实现

这里选择比较熟悉的辗转相除

  1. int find_com(int a, int b) {
  2. int max;
  3. while(b) {
  4. max = a % b;
  5. a = b;
  6. b = max;
  7. }
  8. return a;
  9. }
  10. //这样只要 a % b 余数为零则说明整除,说明找到了最大公约数,具体用笔进行验算
  11. //两个求和A/B a/b 上下同乘得到
  12. // A/B => A * (b * B / c) / (B * b /c)
  13. // a/b => a * (b * B / c) / (B * b /c)
  14. // 新式子 = ((A * b / c) + (a * B /c)) / (B * b /c)

二、源码

  1. #include <cstdio>
  2. #include <cmath>
  3. using namespace std;
  4. int find_com(int a, int b){
  5. int max;
  6. while(b){
  7. max = a % b;
  8. a = b;
  9. b = max;
  10. }
  11. return a;
  12. }
  13. int find_min(int a, int b) {
  14. auto max = find_com(a, b);
  15. return a * b / max;
  16. }
  17. int main(){
  18. auto n { 0};
  19. scanf("%d", &n);
  20. auto a { 0}, b { 0};
  21. auto A { 0}, B { 0};
  22. auto product { 0};
  23. scanf("%d/%d", &A, &B);
  24. // 辗转相除法
  25. for(int i = 1; i != n; ++i){
  26. scanf("%d/%d", &a, &b);
  27. product = find_min(B, b);
  28. A *= product / B;
  29. a *= product / b;
  30. B = product;
  31. A += a;
  32. }
  33. // 是否为负数
  34. if (A < 0) {
  35. printf("-");
  36. A = abs(A); //-A 也行
  37. }
  38. // 能否整除
  39. if (A % B == 0) {
  40. printf("%d", A/B);
  41. } else {
  42. if (auto s = A / B)
  43. printf("%d ", s);
  44. if (A %= B) {
  45. product = find_com(A, B);
  46. printf("%d/%d", A/product, B/product);
  47. }
  48. }
  49. return 0;
  50. }

计算完毕之后,需要考虑一下几种情况
1 分子是否为负数 需要输出 -
2 是否整除 需要输出 整数
3 是否 分子 > 分母 需要化简,整数与分式之间留出一个空格
4 分子分母是否是最简模式,即除去公约数

推荐课程

尹成老师带你学算法

数据结构核心原理与算法应用

发表评论

表情:
评论列表 (有 0 条评论,116人围观)

还没有评论,来说两句吧...

相关阅读