一个分数一般写成两个整数相除的形式:N/M,其中 M 不为0。最简分数是指分子和分母没有公约数的分数表示形式。
现给定两个不相等的正分数 N
1
/M
1
和 N
2
/M
2
,要求你按从小到大的顺序列出它们之间分母为 K 的最简分数。
输入格式:
输入在一行中按 N/M 的格式给出两个正分数,随后是一个正整数分母 K,其间以空格分隔。题目保证给出的所有整数都不超过 1000。
输出格式:
在一行中按 N/M 的格式列出两个给定分数之间分母为 K 的所有最简分数,按从小到大的顺序,其间以 1 个空格分隔。行首尾不得有多余空格。题目保证至少有 1 个输出。
输入样例:
7/18 13/20 12
输出样例:
5/12 7/12
本题的测试点2 是因为题目没有告诉这两个分数到底是哪个大,所以需要自己判断
#include<iostream>
#include<cstdio>
#include<vector>
using namespace std;
struct fengshu{
int fengzi;
int fengmu;
};
int func(int a,int b){
int t=a;
int k=b;
a=max(t,k);
b=min(t,k);
//a>b;
while(b!=0){
int r=a%b;
a=b;
b=r;
}
return (t*k)/a;
}
fengshu trans(fengshu a,int MaxFengmu){
int t=MaxFengmu/a.fengmu;
a.fengzi=t*a.fengzi;
a.fengmu=MaxFengmu;
return a;
}
int gcd(int a,int b){
int m=a,n=b;
a=max(m,n);
b=min(m,n);
while(b!=0){
int r=a%b;
a=b;
b=r;
}
return a;
}
fengshu huajian(int fengzi,int fengmu){
fengshu ans;
int t=gcd(fengzi,fengmu);
fengzi=fengzi/t;
fengmu=fengmu/t;
ans.fengzi=fengzi;
ans.fengmu=fengmu;
return ans;
}
int main(){
fengshu a,b;
int k;
scanf("%d/%d",&a.fengzi,&a.fengmu);
scanf("%d/%d",&b.fengzi,&b.fengmu);
scanf("%d",&k);
int MaxFengmu;//分母的最小公倍数
MaxFengmu=func(a.fengmu,b.fengmu);
MaxFengmu=func(MaxFengmu,k);
a=trans(a,MaxFengmu);//将分数转为最大公倍数的结果
b=trans(b,MaxFengmu);
//将小的放在前面
if(a.fengzi > b.fengzi){
int t=a.fengzi;
a.fengzi=b.fengzi;
b.fengzi=t;
}
vector<fengshu> v;//结果集
for(int i=a.fengzi+1;i<b.fengzi;i++){
//遍历所有可能的分子
fengshu x=huajian(i,MaxFengmu);//将分子为i,分母为MaxFengmu的进行化简
if(x.fengmu==k){
//如果分母满足条件且是最简化
v.push_back(x);
}
}
//输出答案
vector<fengshu>::iterator ite;
ite=v.begin();
cout<<ite->fengzi<<"/"<<ite->fengmu;
for(ite=v.begin()+1;ite!=v.end();ite++){
cout<<" "<<ite->fengzi<<"/"<<ite->fengmu;
}
cout<<endl;
return 0;
}
这是我写的可以通过的代码
来源:CSDN
作者:AHUT_吴海如
链接:https://blog.csdn.net/weixin_41296877/article/details/104651679