回 帖 发 新 帖 刷新版面

主题:那位高手能做出此题????????

设计一个程序,把一个真分数表示为埃及分数之和的形式。
  所谓埃及分数是指分子为1的形式。
   如:7/8=1/2+1/3+1/24

回复列表 (共12个回复)

沙发

简单写了一下,结果正确。
#include <stdio.h>
int main()
{
    int        i,j,k;
    int        fz,fm;
    int        m_fz,m_fm;
    
    fz = 5;
    fm = 18;

    for(i = 2;i < 100;i++) {
        m_fz = m_fm =0;
        for(j = 3;j < 100;j++) {
            if(j == i) continue;
            m_fz = m_fm =0;
            for(k = 4;k < 100;k++) {
                if(k == j || k == i) continue;
                m_fz = i*j+j*k+i*k;
                m_fm = i*j*k;
                if((m_fz % fz == 0) && (m_fm % fm == 0) && m_fz < m_fm) {
                    printf("%d %d %d\n",i,j,k);
                    return 0;
                }
            }
        }
    }
    return 0;
}

板凳

你这是c吧?

3 楼

我看不懂int m_fz,m_fm;是什么意思
能不能解释一下程序
我刚开始学C语言
在下先谢过了

4 楼

一个分数fz/fm可以表示成fz/fm=1/a+1/b+1/c=(a*b+b*c+a*c)/a*b*c,这个小学就学过吧

[color=008000]#include <stdio.h>[/color]
[color=0000FF]int[/color] main()
{
    [color=0000FF]int[/color]        i,j,k;
    [color=0000FF]int[/color]        fz,fm;        //fz分子,fm分母
    [color=0000FF]int[/color]        m_fz,m_fm;    //m_fz临时分子,m_fm临时分母
    
    fz = 5;
    fm = 18;

    [color=0000FF]for[/color](i = 2;i < 100;i++) {
        m_fz = m_fm =0;
        [color=0000FF]for[/color](j = 3;j < 100;j++) {
            if(j == i) continue;
            m_fz = m_fm =0;
            [color=0000FF]for[/color](k = 4;k < 100;k++) {
                if(k == j || k == i) continue;
                m_fz = i*j+j*k+i*k;
                m_fm = i*j*k;
        /* 如果m_fz/m_fm约分后等于fz/fm,打印此数 */
                [color=0000FF]if[/color]((m_fz % fz == 0) && (m_fm % fm == 0) && m_fz < m_fm) {
                    printf("%d %d %d\n",i,j,k);
                    [color=0000FF]return[/color] 0;
                }
            }
        }
    }
    [color=0000FF]return[/color] 0;
}



5 楼

#include<stdio.h>

main()
{
    int i=2,n,m,a,b,r;
    printf("please input the real faction.\n");
    printf("the n is numerator.\n");
    printf("the m is denominator.\n");
    printf("input the n:");               /*输入分子*/
    scanf("%d",&n);
    printf("input the m:");              /*输入分母*/
    scanf("%d",&m);
    while(n!=1){
        if(i*n>m){
            n=i*n-m;
            m=i*m;
            a=m;
            b=n;
            r=a%b;
            while(r){                    /*求最大公约数*/
                a=b;b=r;r=a%b;
            }
            m=m/b;
            n=n/b;
        printf("1/%d+",i);               /*输出因子*/
        }
        i++;
    }
   printf("1/%d\n",m);
   getch();
   return;
}


试了一下

6 楼

//程序是错误的  输入2/5就知道了

7 楼

恩,我的程序是有问题,简单看了一下,判断语句应改成
if(m_fz * fm ==  m_fm * fz)

结果对了,但算法不好,也懒得看了。。。。

8 楼

是说我的吗?2/5=1/3+1/15啊,结果应该没问题。

9 楼

各位高手 ,能用 pascal 遍一下吗?

10 楼

用三个分数不一定能表示得了所有的真数分啊?也许得用更多的!

我来回复

您尚未登录,请登录后再回复。点此登录或注册