例如2/3=1/2+1/3 但不允许2/3=1/3+1/3即相同得数出现,且加数总数越少越好,相同得情况下最小的分数越大越好
代码:
#include<iostream>
using namespace std;
int maxd;
int ans[100]={-1},v[100]={0};
int getfirst(int a,int b)
{
if(b%a==0)
return b/a;
else
return b/a+1;
}
int gcd(int a,int b){
return b==0?a:gcd(b,a%b);
}
bool better(int d)
{
if(v[d]!=ans[d]&&v[d]!=v[d-1])//检验最后一位与倒数第二位是否相同,这里是可能出现例如2/3=1/3+1/3的情况
{
return ans[d]==0||v[d]<ans[d];
}
else
return false;
}
bool dfs(int d,int form,int fz,int fm)
{
if(d==maxd)
{
if(fm%fz==0)
{
v[d]=fm/fz;
if(better(d))memcpy(ans,v,sizeof(int)*(d+1));
return true;
}
else
return false;
}
bool ok=false;
form=max(form,getfirst(fz,fm));
for(int i=form;;i++)
{
if(fm*(maxd+1-d)<fz*i)break;
v[d]=i;
int b2=fm*i;
int a2=fz*i-fm;
int g=gcd(b2,a2);
if(dfs(d+1,i+1,a2/g,b2/g))ok=true;
}
return ok;
}
int main()
{
int ok=0,fz,fm;
cin>>fz>>fm;
for(maxd=1;;maxd++)
{
if(dfs(0,getfirst(fz,fm),fz,fm))
{
ok=1;break;
}
}
if(ok==1)
cout<<fz<<"/"<<fm<<"=";
cout<<"1/"<<ans[0];
for(int i=1;ans[i]!=0;i++)
cout<<"+1/"<<ans[i]<<" ";
}