埃及分数的拆分法

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了埃及分数的拆分法相关的知识,希望对你有一定的参考价值。

所谓埃及分数分解就是将一个分数分解成若干个分子为1的分数之和.如“在114=1()+1()+1()+1()①的( )内填入互不相同的自然数,使等式成立”.对埃及分数分解的研究很多[1,2],一种通行的解法是:将114的分子分母同乘14的四个约数1、2、7、14的和并加以展开.例如,114=1×2414×24=114×24+214×24+714×24+1414×24=1336+1118+148+124.这种方法称为约数和分解法.我们知道,按约数和分解法上例的答案就只有一个.但在学生的答案中,出现了数十个不同的正确答案.这些答案不同于上面的解法,而且找不到共性,这是否是约数和分解法呢?本文就以这个题目为例加以探究把真分数表示为埃及分数之和的形式,所谓的埃及分数是指分子为1的分数
例如:7/8=1/2+1/3+1/24;要求用最少的埃及分数来表示

解析:设a、b为互质正整数,a<b 分数a/b 可用以下的步骤分解成若干个单位分数之和:
步骤一: 用b 除以a,得商数q1 及余数r1。(r1=b - a*q1)
步骤二:把a/b 记作:a/b=1/(q1+1)+(a-r)/b(q1+1)
步骤三:重复步骤2,直到分解完毕
以上其实是 数学家 斐波那契提出的一种求解 埃及分数 的贪心算法,准确的算法表述应该是这样的:
设某个真分数的分子为a,分母为b;
把b除以a的商部分加1后的值作为埃及分数的某一个分母c;
将a乘以c再减去b,作为新的a;
将b乘以c,得到新的b;
如果a大于1且能整除b,则最后一个分母为b/a;算法结束;
或者,如果a等于1,则,最后一个分母为b;算法结束;
参考技术A 当限定分母为奇数时,把“1”分解为埃及分数,项数限定为9项,共有5组解:

1=1/3+1/5+1/7+1/9+1/11+1/15+1/35+1/45+1/231。

1=1/3+1/5+1/7+1/9+1/11+1/15+1/21+1/135+1/10395。

1=1/3+1/5+1/7+1/9+1/11+1/15+1/21+1/165+1/693。

1=1/3+1/5+1/7+1/9+1/11+1/15+1/21+1/231+1/315。

1=1/3+1/5+1/7+1/9+1/11+1/15+1/33+1/45+1/385。

以上5组解是在1976年才找到。限定为11项时,发现了1组解 最小分母是105。若大于105则有很多的解。

1/n型分数还可以表示成为级数分解式:

1/n=1/(n+1)+1/(n+1)^2+1/(n+1)^3+1/(n+1)^4+....+1/(n+1)^k+1/n(n+1)^k.

埃及分数成为不定方程中一颗耀眼的明珠。

埃及分数最著名的猜想是Erods猜想:1950年Erods猜想,对于n〉1的正整数,

总有:

4/n=1/x+1/y+1/z. (1)

其中,x,y,z。都是正整数。

Stralss进一步猜想,当n≥2时,方程的解x,y,z满足x≠y,y≠z,z≠x。x〈y〈z。

1963年柯召,孙奇,张先觉证明了Erods猜想stralss猜想等价。几年后yamanot又把结果发展到10的7次方。以后一些数学家又把结果推向前去,始终未获根本解决。对于4/n=1/x+1/y+1/z,只需要考虑n=p为素数的情况,因为若(1)式成立,则对于任何整数m,m<1,

4/pm=1/xm+1/ym+1/zm,(2)

也成立。

一切奇素数都可以表示为4R+1与4R+3型。对于p=4R+3型,(参见《单位分数》人民教育出版社1962年):(1)式是显然的。

华为机试HJ82:将真分数分解为埃及分数

作者:翟天保Steven
版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处

题目描述:

分子为1的分数称为埃及分数。现输入一个真分数(分子比分母小的分数,叫做真分数),请将该分数分解为埃及分数。如:8/11 = 1/2+1/5+1/55+1/110。

注:真分数指分子小于分母的分数,分子和分母有可能gcd不为1!

如有多个解,请输出任意一个。

请注意本题含有多组样例输入!

输入描述:

输入一个真分数,String型

输出描述:

输出分解后的string

示例:

输入:

8/11
2/4

输出:

1/2+1/5+1/55+1/110
1/3+1/6

说明:

第二个样例直接输出1/2也是可以的

解题思路:

本题有两个方法:1)取巧;2)贪心算法。

1)直接输出n个1/X即可,比如8/11就输出1/11+1/11+。。。+1/11,emm取巧。

2)贪心算法即在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,他所做出的是在某种意义上的局部最优解 。令真分数8/11进行拆分,先找到比其小的最大埃及分数,也就是1/2,那么8/11-1/2等于5/22,则找其最大埃及分数,即1/5,以此类推直到找完所有的埃及分数。其算法实现如下:

  1. 假设真分数为a/b,那么b除以a可以得到c,余数为d。即
  2. 两侧同除a,可以得到;
  3. 因为d是a的余数,所以d<a,那么;
  4. 两边取倒数,即,1/(c+1)就是我们要找的最大埃及分数;
  5. 令e=c+1,则有
  6. 即表示减去一个最大埃及分数后,新的a=a*e-b,新的b等于b*e;
  7. 当a等于1时说明分解到头了,此时的b就是最后一个埃及分数的分母。

测试代码:

1)取巧方法。

#include<iostream>
#include<string>

using namespace std;

int main() {
    string s;
    while (cin >> s) 
    {
        string ans;
        int n;
        for (int i = 0; i < s.size(); i++) 
        {
            if (s[i] == '/') 
            {
                n = stoi(s.substr(0, i));
                s = "1/" + s.substr(i + 1) + "+";
                break;
            }
        }
        while (n--) {
            ans += s;
        }
        cout << ans.substr(0,ans.size()-1) << endl;
    }
    return 0;
}

2)贪心算法。 

#include<iostream>
#include<string>

using namespace std;

int main() {
    string s;
    while (cin >> s) {
        string ans;
        int a,b;
        for (int i = 0; i < s.size(); i++) 
        {
            if (s[i] == '/') {
                a = stoi(s.substr(0, i));
                b = stoi(s.substr(i + 1));
                break;
            }
        }
        while(1)
        {
            int e=b/a+1;
            ans+="1/";
            ans+=to_string(e);
            a=a*e-b;
            b=b*e;
            ans+="+";
            if(a==1)
            {
                ans+="1/";
                ans+=to_string(b);
                break;
            }
            else if(a>1&&b%a==0)
            {
                ans+="1/";
                ans+=to_string(b/a);
                break;
            }
        }
        cout<<ans<<endl;
        
    }
    return 0;
}

以上是关于埃及分数的拆分法的主要内容,如果未能解决你的问题,请参考以下文章

埃及分数

埃及分数式

Vijos 1308 埃及分数(迭代加深搜索)

题解 埃及分数

华为机试HJ82:将真分数分解为埃及分数

埃及分数,迭代加深