【算法】广度优先搜索与深度优先搜索 埃及分数

给定一个分数,如7/8,我们可以把它表示为1/2 + 1/3 +1/24,埃及分数问题即把一个真分数表示为最少的埃及分数之和的形式。

思路1:

https://www.jianshu.com/p/da04c77e11d0

思路2:

https://wenku.baidu.com/view/7d547518227916888486d78b.html

NOIP题库:

http://www.rqnoj.cn/problem

ACM题库,LEETCODE题库,Lintcode题库。

这里使用最简单的贪心算法:

#include <stdio.h>

int gcd(int a, int b);

void reduce(int *a, int *b);

void egypt(int a, int b);

int main(void)
{
    int a, b;
    scanf("%d/%d", &a, &b);
    egypt(a, b);
    return 0;
}

int gcd(int a, int b)
{
    int r;
    if(a < b)
    {
        r = a;
        a = b;
        b = r;
    }

    do
    {
        r = a % b;
        a = b;
        b = r;
    }while(b);
    return a;
}

void reduce(int *a, int *b)
{
    int common = gcd(*a, *b);
    *a = *a / common;
    *b = *b / common;
}

void egypt(int a, int b)
{
    int i = 1, k;
    // 加上一个判断真分数 假分数的。
    reduce(&a, &b);
    printf("After dividing %d / %d\n", a, b);

    while(1)
    {
        if(a == 1)
        {
            printf("1/%d.\nEnding\n", b);
            break;
        }    
        while(a*++i > b) // a/b > 1/i, 可以分解出1/i
        {
            printf("1/%d + ", i);
            a = a * i - b; // 从a/b中减去那个埃及分数
            b = b * i;    // 通分相减 
            reduce(&a, &b);  // 约分
        }
    }
}

猜你喜欢

转载自www.cnblogs.com/paprikatree/p/10525725.html