埃及分数:埃及分数是指分子是1的分数,也叫单位分数。古代埃及人在进行分数运算时。只使用分子是1的分数。因此这种分数也叫做埃及分数,或者叫单分子分数。
题意:给你一个分数,要求输出最优(式子尽量短,每一个分数尽量大)的一组由埃及数组成的解
思路一:暴力,枚举1/2到1/n的所有情况,不过这样可能耗时比较大,而且可能存在乘法溢出的情况。
思路二:公式:例:a/b,q=b/a,r=b%a-->a/b=1/(q+1)+(a-r)/(b*(q+1));知道(a-r)=0或者b*(q+1)%(a-r)=0时满足条件。
代码:
#include<stdio.h>
void aijishu(long long a,long long b)//贪心
{
if(a==1)
return;
long long q=b/a,r=b%a;
printf("1/%d",q+1);
while(a!=1)
{
a=a-r,b=b*(q+1);
q=b/a,r=b%a;
if(a==1||(a>1&&(b%a==0)))
{
b=b/a;a=1;
printf("+1/%d\n",b);
}
else
printf("+1/%d",q+1);
}
}
long long qiucha(long long a,long long b,long long c,long long d)
{
return b*c-a*d;
}
void baoli(long long a,long long b)//暴力
{
if(1.0/2<a*1.0/b)
{
printf("1/2+");
a=qiucha(1,2,a,b),b=2*b;
}
if(a==1||(a>1&&b%a==0))
{
printf("1/%d\n",b/a);
return;
}
for(long long i=3;;i++)
{
if(1.0/i>a*1.0/b)
continue;
printf("1/%d+",i);
a=qiucha(1,i,a,b),b=i*b;
if(a==1||a>1&&(b%a)==0)
{
printf("1/%d\n",b/a);
break;
}
}
}
int main()
{
long long a,b;
while(~scanf("%lld%lld",&a,&b))//必须a<b&&a!=0
{
aijishu(a,b);
baoli(a,b);
}
}
若代码有错请牛人指出,但456 457这组样例不能过,原因是数据大导致乘法溢出。若有好的修正方法请指正。