[NEFU 358] 埃及分数 [迭代加深]

来源:互联网 发布:2010年的网络歌曲大全 编辑:程序博客网 时间:2024/06/04 19:09

把一个分数分解为若干个互不相同的分子为1的分数的和

迭代加深搜索,假设分解为k个分数的和,若搜索失败则k++

题目坑...他说最大的分母最小,若相同则次大的分母最大...实际上是最大的分母最小,若相同则最小的分母最小,然后次小的分母最小..


#include <cstdio>#include <cstring>int ans[11],p,d[11],m;int gcd(int a,int b) {int c=a%b;while (c) {a=b;b=c;c=a%b;}return b;}bool dfs(int a,int b,int c,int n) {int z=gcd(a,b);a/=z;b/=z;if (a==1&&b>=c&&n==1) {m=ans[n]=b;//for (int i=1;i<11;i++) printf("%d ",ans[i]);//printf("%d %d\n",d[n],ans[n]);if (d[n]==0||d[n]>ans[n]) memcpy(d,ans,sizeof(d));/*else if (d[n]==ans[n]) {for (int i=2;i<11;i++) {if (d[i]<ans[i]) {memcpy(d,ans,sizeof(d));return true;} else if (d[i]>ans[i]) {return true;}}}*/return true;}if (n==1) return false;int t=n*b/a;if (m!=0&&m-1<t) t=m-1;bool flag=false;for (int i=c>b/a+1?c:b/a+1;i<=t;i++) {ans[n]=i;int x=i*a-b,y=i*b;if (dfs(x,y,i+1,n-1)) {flag=true;}}return flag;}int main() {int a,b,n;while (scanf("%d%d",&a,&b)!=EOF) {d[1]=0;n=1;m=0;while (p=0,!dfs(a,b,1,n)) n++;printf("%d/%d=1/%d",a,b,d[n]);for (int i=n-1;i>0;i--) printf("+1/%d",d[i]);printf("\n");}return 0;}


0 0