埃及分数 Egyptian Fractions (HARD version)

本文探讨了如何解决埃及分数问题,尤其是对于较难的情况。文章指出,任何真分数可以通过埃及分数之和表示,并强调未剪枝的搜索方法会导致超时。介绍了一种基于搜索的解决方案,包括从最简形式开始,逐步增加单位分数的个数,从最小分母开始试探。还提到原题目的输出要求,即需要按照分母升序输出埃及分数。最后提供了原题解的博客链接以供参考。
摘要由CSDN通过智能技术生成

某谷的题面

蒟蒻认为此题难度挺大,(dalao除外 )不过要用搜索大家应该还是看得出来的。(dfs)

任何一个真分数a/b(且a小于b)一定能表示成埃及分数之和,因此一定能搜索到解。
但是不剪枝的话是会T掉的哦~~
按a/b可拆分成的单位分数的个数进行循环搜索。
1)先将a/b分子分母消去因子,化为最简形式。
2)如果a=1则直接输出b。
3)否则从拆分成2个项开始尝试。如果2个单位分数无法拼凑成a/b,则试3个……依此类推。那么我们搜索得到的第一个解一定会满足加数个数最少这个要求。
4)如果当加数个数等于n项,且当前正在试探第m项(m大于等于1,且小于等于n)的时候,因此应从最小分母开始试探。

先定义符号:
n为需要的单位分数个数,n从2个开始尝试,不成功而后3个……
m表示当前正在搜索第m个分数(m从1到n)
egp[m]存储当前搜索得到的第m个分数的分母
a/b为题目输入的真分数

蒟蒻之前做的题是用最好的埃及分数表示法来表示分数中的分母,从小到大依次输出。

所以说程序直接交是过不了的哦,起码也要自己改一下:

#include <bits/stdc++.h>
const int m = 100;
int d = 0 , min , c;
int ans[m] , out[m];
void find(int a , int b , int x) 
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
埃及分数是一种特殊的分数表示方式,它表示为若干个分数之和,其中每个分数的分子为1,分母为正整数,且分母互不相同。例如,6/7可以表示为1/2 + 1/3 + 1/42。 贪心算法可以用来求解埃及分数,具体实现如下: 1. 输入一个正分数x,初始化一个空数组fractions用于存放埃及分数。 2. 从最大的分母开始,不断尝试将x表示为1/denominator的形式,直到x变为0或者分母为1为止。 3. 对于每个分母,计算出当前能够表示的最大的1/denominator的分数,将该分数加入fractions数组中,并将x减去该分数。 4. 如果x已经为0,返回fractions数组作为结果;否则,重新从最大的分母开始尝试表示x,重复步骤3和4,直到x变为0为止。 以下是具体的C语言实现: ```c #include <stdio.h> int main() { double x; scanf("%lf", &x); // 输入待转换的分数 int denominator = 1; // 分母从1开始 int fractions[100], count = 0; // 存放埃及分数的数组和计数器 while (x > 0) // 当x不为0时继续循环 { int numerator = (int) (denominator * x + 1); // 计算当前能够表示的最大分数的分子 fractions[count++] = numerator / denominator; // 将该分数加入fractions数组 x -= 1.0 * fractions[count-1] / denominator; // 减去该分数 denominator = numerator % denominator; // 更新分母 } printf("Egyptian fractions: "); for (int i = 0; i < count; i++) printf("1/%d + ", fractions[i]); printf("\b\b \n"); // 输出埃及分数 return 0; } ``` 运行该程序,输入一个待转换的分数,即可得到其对应的埃及分数
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值