| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 6480 人关注过本帖, 2 人收藏
标题:埃及分数——用c解(小白一个)
只看楼主 加入收藏
weisx
Rank: 1
来 自:吉林
等 级:新手上路
帖 子:20
专家分:0
注 册:2016-2-29
结帖率:100%
收藏(2)
已结贴  问题点数:20 回复次数:8 
埃及分数——用c解(小白一个)
【问题描述】
在古埃及,人们使用单位分数的和(形如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都大。
给出a,b(0〈a〈b〈1000),编程计算最好的表达方式。
【要求】
【数据输入】第一行:N 表示试数据为有N组测试数据,每组测一行包含a,b(0〈a〈b〈1000)。
【数据输出】每组测试数据若干个数,自小到大排列,依次是单位分数的分母。
【样例输入】
1
19 45
【样例输出】
5 6 18
搜索更多相关主题的帖子: 自然数 有理数 埃及 最好 
2016-02-29 17:10
qq1023569223
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:湖南科技大学
等 级:贵宾
威 望:26
帖 子:2753
专家分:13404
注 册:2010-12-22
收藏
得分:5 
这个有难度,看看数学家的办法。http://blog.
【贪心算法】
设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,直到分解完毕
3/7=1/3+2/21=1/3+1/11+1/231
13/23=1/2+3/46=1/2+1/16+1/368
以上其实是数学家斐波那契提出的一种求解埃及分数的贪心算法,准确的算法表述应该是这样的:
设某个真分数的分子为a,分母为b;
把b除以a的商部分加1后的值作为埃及分数的某一个分母c;
将a乘以c再减去b,作为新的a;
将b乘以c,得到新的b;
如果a大于1且能整除b,则最后一个分母为b/a;算法结束;
或者,如果a等于1,则,最后一个分母为b;算法结束;
否则重复上面的步骤。
备注:事实上,后面判断a是否大于1和a是否等于1的两个判断可以合在一起,及判断b%a是否等于0,最后一个分母为b/a,显然是正确的。

   唯实惟新 至诚致志
2016-02-29 20:10
liu122430950
Rank: 4
等 级:业余侠客
威 望:1
帖 子:45
专家分:211
注 册:2010-5-30
收藏
得分:0 
回复 2楼 qq1023569223
赞!在哪高就?
2016-03-01 02:02
qq1023569223
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:湖南科技大学
等 级:贵宾
威 望:26
帖 子:2753
专家分:13404
注 册:2010-12-22
收藏
得分:0 
高就算不上,打工的

   唯实惟新 至诚致志
2016-03-01 07:59
weisx
Rank: 1
来 自:吉林
等 级:新手上路
帖 子:20
专家分:0
注 册:2016-2-29
收藏
得分:0 
回复 2楼 qq1023569223
谢谢,
2016-03-01 09:20
azzbcc
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:江西财经大学
等 级:贵宾
威 望:81
帖 子:3293
专家分:12919
注 册:2012-11-4
收藏
得分:7 
http://blog.


[fly]存在即是合理[/fly]
2016-03-01 09:29
拉链
Rank: 7Rank: 7Rank: 7
等 级:黑侠
帖 子:107
专家分:534
注 册:2016-1-22
收藏
得分:8 
前段时间在数据结构与算法里帮人做过因数分解的题,感觉也可应用到这里,下午坐办公室没事就做了,欢迎测试提宝贵意见(递归里有很大的优化余地,不愿烧脑了):
程序代码:
#include <stdio.h>
int ff(int a[],int n,int p,int fz)
{   
    int i,j,s;
    a[p+1]=n;
    a[p+2]=0;
    for(i=1,j=1;a[i];i++)
    {
        if(a[i]<=a[i-1])j=0;               //消除相同分母,即取消2/3=1/3+1/3
        j*=a[i];                           //获得公分母
    }
    for(i=1,s=0;a[i];i++)s+=j/a[i];
    if(s==fz)return 1;                     //找到埃及分数直接返回显示(公分子和等于fz)
    if(a[p]*a[p]>n)return 0;
    for(i=p>0?a[p]:2;i*i<=n;i++)
    {
        if(!(n%i))
        {
            a[++p]=i;                     //存储因数
            j=ff(a,n/i,p,fz);             //递归调用
            if (j)return 1;               //已经找到埃及分数,不再分解因式
            p--;                          //回溯,剪枝
        }
    }
    return 0;
}
void main()
{
    int a[100],fz,fm,i,j;
    scanf("%d%d",&fz,&fm);
    for(i=2;i<=1000;i++)                  //1000倍的范围内不一定找的到埃及分子,可调至10000
    {
        a[0]=1;
        if(ff(a,fm*i,0,fz*i))
        {
            printf("%d/%d=",fz,fm);
            for(j=1;a[j];j++)
            {
                printf("1/%d",a[j]);
                if(a[j+1])printf("+");
            }
            printf("\n");
            break;
        }
    }
}
2016-03-01 17:18
weisx
Rank: 1
来 自:吉林
等 级:新手上路
帖 子:20
专家分:0
注 册:2016-2-29
收藏
得分:0 
回复 7楼 拉链
完美运行,谢谢
2016-03-02 12:31
weisx
Rank: 1
来 自:吉林
等 级:新手上路
帖 子:20
专家分:0
注 册:2016-2-29
收藏
得分:0 
回复 6楼 azzbcc
谢谢
2016-03-02 17:54
快速回复:埃及分数——用c解(小白一个)
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.018239 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved