美文网首页
埃及分数

埃及分数

作者: Amosasas | 来源:发表于2017-10-11 00:00 被阅读0次

    亲爱的题解被简书吃掉了。。。下面只贴代码。。。

    #include <iostream>
    #include <algorithm>
    #include <cstdlib>
    #include <cstdio>
    #include <cstring>
    using namespace std;
    int a,b,maxd,flag;
    int ans[15],v[15];
    int gcd(int aa,int bb){
        return bb == 0 ? aa : gcd(bb,aa%bb);
    }
    void dfs(int d,int aa,int bb){
        if(d == maxd){
            if(bb%aa==0 && bb/aa > v[d-1]){
                v[d] = bb/aa;
                for(int i = 1; i <=maxd; i++) cout<<v[i]<<" ";
                cout<<endl;
                if(!flag || v[d] < ans[d])
                    for(int i = 1; i <=maxd; i++) ans[i] = v[i];
                flag = 1;
                return;
            }
            return;
        }
        int s = bb/aa+1;
        s = max(s,v[d-1]+1);
        int t = max((maxd-d+1)*bb/aa,s);
        //printf("maxd %d d %d s %d t %d aa %d bb %d\n",maxd,d,s,t,aa,bb);
        for(int i = s;i <= t;i++){
            v[d] = i;
            printf("maxd %d d %d i %d\n",maxd,d,i);
            int aa2 = aa*i-bb;
            int bb2 = bb*i;
            int g = gcd(aa2,bb2);
            dfs(d+1,aa2/g,bb2/g);
        }
    }
    int main(){
        while(scanf("%d %d",&a,&b) == 2){
            flag = 0;
            for(maxd = 2;maxd <= 10;maxd++){
                memset(v, -1, sizeof(v));
                dfs(1,a,b);
                if(flag){
                    printf("%d/%d=",a,b);
                    for(int i=1;i<maxd;i++)
                        printf("1/%d+",ans[i]);
                    printf("1/%d\n",ans[maxd]);
                    break;
                }
            }
            if(!flag)
                printf("No solutuon\n");
        }
    }
    

    。。。我知道写得很垃圾。。。因为今天真的很困。。。而且亲爱的轮子哥又在跟我逼逼本科直接找工作不要刷那么多题。。。多做工程。。。问题系。。。我现在不仅做不动而且没人一起做阿。。。。

    相关文章

      网友评论

          本文标题:埃及分数

          本文链接:https://www.haomeiwen.com/subject/jdkiyxtx.html