1.问题:给定一个分数,如7/8,我们可以把它表示为1/2 + 1/3 +1/24,埃及分数问题即把一个真分数表示为最少的埃及分数之和的形式,输入一个真分数把其分解为埃及分数之和。
2.设计思路:设分数为a/b,则c=b/a,d=b%a,有b=a*c+d通过递推数学公式可以知道,给定分数的最大埃及分数的分母为e=c+1=b/a+1;循环的出口为分子a=1;需要把真分数拆开计算,a=a*c-b,b=b*c;如果a=3而且b%2=0时,可以直接拆成两个埃及分数之和1/(b/2)+1/b,再结束;
3.代码:
/*埃及分数问题*/
#include <stdio.h>
int main()
{
int a,b,c;
printf("请输入真分数(a/b):\n");
scanf("%1d/%1d",&a,&b);
printf("结果为:");
while(1)
{
if(b%a) //如果分子不能被分母整除,就计算出一个埃及分数的分母
{
c=b/a+1;
}
else{ //进行化简 ,分数可以被整除的时候,可以直接化简为一个埃及分数
c=b/a;
a=1;
}
if(a==1)
{
printf("1/%1d\n",c);
break;
}
else{
printf("1/%1d+",c);
}
a=a*c-b; //计算余数的分子,通分相减
b=b*c; //计算余数的分母
if(a==3&&b%2==2) //此种情况下可以直接化简为两个埃及分数之和,然后结束循环
{
printf("1/%1d+1/%1d\n",b/2,b);
break;
}
}
return 0;
}
4.运行结果: