开了个帖子qaq
  • 板块学术版
  • 楼主呆呆的她啊
  • 当前回复6
  • 已保存回复7
  • 发布时间2023/11/7 17:51
  • 上次更新2023/11/7 18:36:16
查看原帖
开了个帖子qaq
226167
呆呆的她啊楼主2023/11/7 17:51

@CIHg2代码如下 已经写好了注释埃及分数题目

#include<iostream>
using namespace std;
typedef long long ll;
ll  a,b; ll dep; ll found=0;
ll now[1005];ll ans[1005];
int yuefen(ll aa, ll bb)
{
	if(bb==0)return aa;
	return yuefen(bb,aa%bb);	
}//这是一个约分的函数 
void Idfs(ll a,ll b,ll d)
{
	if(d==dep)
	{	//当进行自定的最后的深度 进行判断要求a此时必须为1了就是分子 
		//不能是2 3 4这些 这样说明没拆干净要继续拆的  now数组是指此时存贮的分母 ans是答案的
		if(a==1&&now[d-1]<b)
		{
			
			now[d]=b;
			if(!found||ans[d]>now[d])//没找到或者有更优解
			{
				for(int i=1;i<=dep;i++)ans[i]=now[i];//覆盖ans		
			}
			found=1;
		}
		return ;
	}
	ll left1=max(b/a+1,now[d-1]+1);
	ll right1=1e7;
	if(found)right1=ans[dep]-1;//如果找到了就可以进一步剪枝
	right1=min(right1,b/a*(dep-d+1));
	for(ll i=left1;i<=right1;i++)
	{ 	now[d]=i;
		ll shang=a*i-b;//通分 
		ll xia=b*i;//通分
		//自己少了 now[d]=i;
		int  g= yuefen(shang,xia);
		Idfs(shang/g,xia/g,d+1);		
	}	
}
int main()
{
	cin>>a>>b;
	for(dep=1;!found;dep++)	Idfs(a,b,1);
	for(int i=1;i<=dep-1;i++)cout<<ans[i]<<" ";	
	return 0;	
}
2023/11/7 17:51
加载中...