题意:
分子为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; }
时间复杂度:空间复杂度: