题意:
分子为1的分数称为埃及分数。现输入一个真分数(分子比分母小的分数,叫做真分数),请将该分数分解为埃及分数。
如:8/11 = 1/2+1/5+1/55+1/110。
注:真分数指分子小于分母的分数,分子和分母有可能gcd不为1!
方法一:
公式法
思路:
如果分母可以整除分子,跳出循环。
#include <bits/stdc++.h>
using namespace std;
int x,y;
char ch;
int main(){
while(cin >> x >> ch >> y){//输入
while(x!=1){
if(y%x==0){
y=y/x;
x=1;
break;
}
int z=y/x;//计算商
int w=y%x;//计算余数
cout << "1/" << z+1 << "+";
x=x-w;//更新x
y=y*(z+1);//更新y
}
printf("1/%d",y);
cout << endl;
}
return 0;
}
时间复杂度:
空间复杂度:![]()
方法二:
递归
思路:递归实现,思路与方法一相同。
递归结束的条件是x==1或y%x==0.
#include <bits/stdc++.h>
using namespace std;
//递归
void dfs(int x,int y){
if(x==1){
printf("1/%d\n",y);
return;
}
if(y%x==0){
printf("1/%d\n",y/x);
return;
}
int z=y/x;//计算商
int w=y%x;//计算余数
cout << "1/" << z+1 << "+";
x=x-w;//更新x
y=y*(z+1);//更新y
dfs(x,y);
}
int main(){
int x,y;
char ch;
while(cin >> x >> ch >> y){//输入
dfs(x,y);
}
return 0;
}
时间复杂度:
空间复杂度:![]()



京公网安备 11010502036488号