此代码摘抄自CSDN,作者:Bonstoppo

#include<iostream>
using namespace std;
 
int gcd(int a , int b) {
 if(b == 0) return a;
 else gcd(b , a % b);
}
 
int lcm (int b , int d , int e) {
 int f , h;
 f = gcd(b , d);
 f = b / f * d;
 h = gcd(f , e);
 h = f / h * e; 
 return h;
}
int main() {
 int a , b , c , d , e;
 int count = 0;
 int g[1005] = {0} ;
 scanf("%d/%d %d/%d %d" , &a , &b , &c , &d , &e);
 int f = lcm(b , d , e);
 a = f / b * a ;
 c = f / d * c ;
 
 if(a > c){
  int temp = a; a = c; c = temp;
  temp = b; b = d; d = temp;
 }
 
 for(int i = a + 1 ; i < c ; i ++) {
  if(f % e == 0){
   if(i % (f / e) == 0 && gcd(i / (f / e) , e) == 1) {
    g[count ++] = i / (f / e);
   }
     }
 }
 for(int i = 0 ; i < count ; i ++) {
  if(i == count - 1) {
   printf("%d/%d" , g[i] , e);
   break;
  }
  printf("%d/%d " , g[i] , e);
 }
 return 0;
}
 
主函数前半部分可以看出,a,b两数组成一个分数,c,d两数组成另一个分数,e暂时不知道是啥。
首先gcd函数,输入两个参数,如果b等于0,则返回a的值,否则继续调用gcd函数,参数变为b,a%b,直到后一个参数a%b为0为止。
再看lcm函数,参数为b,d,e,创建临时变量f,h,此函数功能为找出三个数的最小公倍数,最小公倍数=a×b/(ab的最大公因数)。在下面的main函数中的f即为最小公倍数。
主函数中的a,c分子变换,也就是所谓的通分。
接下来的a,c比大小是为了保证后续从小到大的排序,如果不相等,两个分数要交换位置。
接下来,在a到c之间,把符合条件的赋值给g数组。他这个条件暂时还没有理解,感觉大概的意思就是要等比例缩小,让i与分母e最简;
后面那个条件是分子分母最大公因数为1则为最简,两个条件都满足即可。
我觉得if(f % e == 0)这行有些多余,因为f为e的最小公倍数,所以一定会整除,但不知原代码的作者是什么思路,是否有特例。
最后直接输出以e为分母,数组g中的数字为分子的分数即可。
所以其实整个程序想实现的就是:一个分数一般写成两个整数相除的形式:N/M(M 不为0)。
现给定两个不相等的正分数 N1​​/M1​​ 和 N2​​/M2​​,按从小到大的顺序列出它们之间分母为 K 的最简分数(最简分数分子和分母没有公约数的分数表示形式。)
这个程序用到了辗转相除法,比较难,但先建立函数思路就会稍微清晰一些。
 
ps:在另一个编译器中编译后,没有正常运行,也算是发现一个新的问题。

 

感觉应该是没有加#include<stdio.h>,但在有些编译器中#include<iostream>已经包含输入输出函数了。

 
1759118  李铮达