把一个分数分解为若干个互不相同的分子为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;
}