埃及分数 代码写好了,看不懂,求注释

昵称是可以中文吗 2010-11-10 09:30:23
在古埃及,人们使用单位分数的和(形如1/a的, a是自然数)表示一切有理数。

如:2/3=1/2+1/6,但不允许2/3=1/3+1/3,因为加数中有相同的。

对于一个分数a/b,表示方法有很多种,但是哪种最好呢?

首先,加数少的比加数多的好,其次,加数个数相同的,最小的分数越大越好。

如:

19/45=1/3 + 1/12 + 1/180

19/45=1/3 + 1/15 + 1/45

19/45=1/3 + 1/18 + 1/30,

19/45=1/4 + 1/6 + 1/180

19/45=1/5 + 1/6 + 1/18.

最好的是最后一种,因为1/18比1/180,1/45,1/30,1/180都大。
Input
仅一行,包括两个整数a和b,它们之间用空格分开,分别表示分数的分子和分母。Output
用最好的埃及分数表示法来表示分数中的分母,从小到大依次输出。
Sample Input
19 45
Sample Output
5 6 18
...全文
436 20 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
yekeyishuo 2010-11-12
  • 打赏
  • 举报
回复
用回溯法求解
  • 打赏
  • 举报
回复
qiu(m*t-n,n*t,k-1);//递归为何要乘以t
  • 打赏
  • 举报
回复
high = (k*n%m==0)? k*n/m-1:k*n/m;//可能出现的最大分母不是有很多情况吗
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 wyfwx 的回复:]

程序员需要看懂别人代码,先自己研究吧
[/Quote]
谢谢,我会努力的
lhy 2010-11-10
  • 打赏
  • 举报
回复

void qiu(int m, int n, int k)//k从1到10
{
int i,t,low,high;

t=Gg(m,n);//求最大公约数
m/=t;
n/=t;

if (k==1)
{
if (m==1)//为1/n的情况
{
b[0]=n;
if (!g|| (g && n<a[0]))//前一种是输入就是1/n,后一种是递归出结果
{
g=1;
for (i=0; i<c; i++)
a[i]=b[i];//a是输出数组
}
}
}
else
{
low=n/m+1;//可能出现的最小分母
if (k<c &&b[k]+1>low)
low=b[k]+1;//不能出现比前一个分母大的或者相同的分母
high = (k*n%m==0)? k*n/m-1:k*n/m;//可能出现的最大分母
for (t=low; t<=high; t++)
{
b[k-1]=t;//循环各种可能性
qiu(m*t-n,n*t,k-1);//递归
}
}
}
wyfwx 2010-11-10
  • 打赏
  • 举报
回复
程序员需要看懂别人代码,先自己研究吧
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 begges 的回复:]
太难了,程序也许不难,但是算法不懂。
[/Quote]
是不是我发错版块了??
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 luciferisnotsatan 的回复:]

代码写完了,自己看不懂,让别人来注释?
[/Quote]
别人写的
FrankHB1989 2010-11-10
  • 打赏
  • 举报
回复
DFS,没用DP。
luciferisnotsatan 2010-11-10
  • 打赏
  • 举报
回复
代码写完了,自己看不懂,让别人来注释?
begges 2010-11-10
  • 打赏
  • 举报
回复
太难了,程序也许不难,但是算法不懂。
zgjxwl 2010-11-10
  • 打赏
  • 举报
回复
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 fancymouse 的回复:]
它自己都说了是搜索。
[/Quote]
qiu(int m, int n, int k)看不懂啊
FancyMouse 2010-11-10
  • 打赏
  • 举报
回复
它自己都说了是搜索。
  • 打赏
  • 举报
回复
按a/b可拆分成的单位分数的个数进行循环搜索。
1,如果a=1则直接输出。
2,否则从2个开始尝试。如果2个单位分数无法拼凑成a/b,则试3个……依此类推。那么我们搜索得到的第一个解一定会满足个数最少这个要求。
3,如果当个数等于n的时候搜索到一组解,那么我们只要在个数为n的这次搜索中选择最优解。

在搜索个数等于n个时,而你正进行第m个分数分母的搜索这期间,再如何搜索?
上面哪种方法是不是用到动态规划
  • 打赏
  • 举报
回复

#include <stdio.h>

#define N 10
int a[N],b[N],c;
int g;

int Gg(int m, int n)
{
int t;
while (m>0)
{
t=n%m;
n=m;
m=t;
}
//printf("%d\n",n);
return n;
}


void qiu(int m, int n, int k)//k从1到10
{
int i,t,low,high;

t=Gg(m,n);//求最大公约数
m/=t;
n/=t;

if (k==1)
{
if (m==1)
{
b[0]=n;
if (!g|| (g && n<a[0]))
{
g=1;
for (i=0; i<c; i++)
a[i]=b[i];
}
}
}
else
{
low=n/m+1;
if (k<c &&b[k]+1>low)
low=b[k]+1;
high = (k*n%m==0)? k*n/m-1:k*n/m;
for (t=low; t<=high; t++)
{
b[k-1]=t;
qiu(m*t-n,n*t,k-1);
}
}
}


int main(void)
{
int i,m,n;
scanf("%d %d",&m,&n);
g=0;
c=0;
do
{
c++;
qiu(m,n,c);
}while (!g&& c<N);

if (g)
{
for (i=c-1; i>=0; i--)
printf("%d ",a[i]);
//printf("%d\n",a[0]);
}


return 0;
}
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 lhylhy 的回复:]

引用 15 楼 scauscnu 的回复:
high = (k*n%m==0)? k*n/m-1:k*n/m;//可能出现的最大分母不是有很多情况吗

只有两种情况
引用 16 楼 scauscnu 的回复:
qiu(m*t-n,n*t,k-1);//递归为何要乘以t

m/n-1/t 用分数表示结果
[/Quote]
谢谢,继续研究中
lwbeyond 2010-11-10
  • 打赏
  • 举报
回复
只有他自己知道吧
lhy 2010-11-10
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 scauscnu 的回复:]
high = (k*n%m==0)? k*n/m-1:k*n/m;//可能出现的最大分母不是有很多情况吗
[/Quote]
只有两种情况
[Quote=引用 16 楼 scauscnu 的回复:]
qiu(m*t-n,n*t,k-1);//递归为何要乘以t
[/Quote]
m/n-1/t 用分数表示结果

70,026

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧