此代码摘抄自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 李铮达