{递归}埃及分数

xiaoxiao2021-02-28  80

按刘汝佳书上解法做的(注意递归什么时候结束)

#include<stdio.h> #include<string.h> int maxd; int ans[100]; int temp[100]; int smallestdeno(int a,int b) { int res = b/a; return res*a >= b?res:res+1; } int gcd(int a,int b) { return b==0? a:gcd(b,a%b); } int max(int a,int b) { return a>b ? a: b; } bool better(int cur) { for(int i=cur; i >= 0; --i) { if(ans[i]==-1 || temp[i]<ans[i]) return true; } return false; } bool dfs(int cur,int a,int b,int from) { if(cur == maxd) { if(b % a) return false; temp[cur] = b/a; if(better(cur)) { memcpy(ans,temp,sizeof(temp)); } return true; } int start = max(from,smallestdeno(a,b)); bool ok = false; for(int i = start;; ++i) { if((maxd+1-cur)*b <= a*i ) break; temp[cur] = i; int aa = a*i-b; int bb = b*i; int g = gcd(bb,aa); bool res = dfs(cur+1, aa/g, bb/g, i+1); if(res) ok = 1; } return ok; } int main() { int a,b; while(scanf("%d%d", &a, &b)==2) { for(maxd = 1;;maxd++) { memset(ans,-1,sizeof(ans)); memset(temp,-1,sizeof(temp)); if(dfs(0,a,b,0)) break; } int i=0; while(ans[i]!=-1) { printf("%d ",ans[i]); i++; } putchar(10); } }

转载请注明原文地址: https://www.6miu.com/read-82608.html

最新回复(0)