您的位置:首页 > 编程语言

埃及数字的代码实现

2016-10-31 22:39 106 查看
</pre><p>中间居然用int会数据溢出,注意用LL就行了,IDA*算法 深度迭代的应用<em></em></p><p></p><pre name="code" class="cpp">#include<cstdio>
#include<iostream>
#include<cstring>

using namespace std;
unsigned long long u,d,cnt=1,ans[1000],best[1000];
unsigned long long gcd(unsigned long long a,unsigned long long b){
if(b>a)a^=b^=a^=b;
return b>0?gcd(b,a%b):a;
}
void pure(unsigned long long&a,unsigned long long&b){
unsigned long long c=gcd(a,b);
a=a/c;
b=b/c;                        //对ab进行通分
}
unsigned long long okmin(unsigned long long u,unsigned long long d){
unsigned long long i=0;
while(1){
if(i*u>=d){
return i;
}
i++;
}
}
void better(unsigned long long maxd){   //更新较好的答案
bool jd=true;
for(unsigned long long i=0;i<=maxd;i++)cout<<ans[i]<<" ";
cout<<"\n";
for(int i=maxd;i>=0;i--){
if(ans[i]>best[i]){
jd=true;
break;
}
}

if(jd||best[0]==-1){
for(unsigned long long i=0;i<=maxd;i++){
best[i]=ans[i];
}
}

}
bool t=false; //作为找到解的标志
void dfs(unsigned long long maxd,unsigned long long curd,unsigned long long maxn){
if(maxd<curd){
better(maxd);
t=true;
return;
}
unsigned long long g=okmin(u,d);
g=max(g,maxn+1);
while((maxd-curd+1)*d>=u*g){  //基于深度的枝剪
unsigned long long tu=u,td=d;
ans[curd]=g;
u=u*g-d;
d=td*g;
pure(u,d);
dfs(maxd,curd+1,g);
u=tu;
d=td;
g++;
}

}
int main(){

while(cin>>u>>d){
t=false;
pure(u,d);
cout<<"case "<<cnt++<<" \n";
unsigned long long maxd=-1;
memset(best,-1,sizeof(best));
while(1){
maxd++;
unsigned long long tem=okmin(u,d);
dfs(maxd,0,tem-1);
if(t)break;
}
for(unsigned long long i=0;i<=maxd;i++)cout<<best[i]<<" ";
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: