埃及分数(贪心算法)

    科技2022-07-11  161

    https://blog.csdn.net/tterminator/article/details/50930342. 思路为借鉴上个链接,代码为自己所写。 一、问题描述

    把一个真分数表示成最少的埃及分数之和。 埃及分数即分子为1的分数。

    二、问题分析

    1、贪心算法的思想在本问题中的体现为在每一步的分解中都寻找最大的埃及分数。

    2、具体步骤如下

    步骤一

    假设真分数N/M的分子为N,分母为M,则有下式成立

    M = K * N + Z,其中Z必小于N

    两边同时除以分子N后,可知

    M/N = K + Z/N < K + 1

    所以,必有下式成立

    N/M > 1/K+1

    所以,小于真分数N/M的最大埃及分数为1/K+1。

    步骤二

    下一步再寻找N/M - 1/K+1的最大埃及分数,通分后也即寻找真分数(N*(K+1) - M)/M*(K+1)的最大埃及分数。

    在开始之前,需要先把(N*(K+1) - M)/M*(K+1)约分,也即寻找分子与分母的最大公约数,详见博文两正整数最大公约数。

    约分之后再按步骤一的解法寻找最大埃及分数。

    步骤三

    步骤一和步骤二循环执行,直到分子为1。

    int maxComDiv(int num1,int num2); int egyptFraction(int num1,int num2); int egyptFraction(int num1,int num2){ int n=num1;//分子 int m=num2;//分母 while(n>1){ int temp1=0; int temp2=0; int a=0; int b=0; //找最大真分数 temp1=m/n; temp2=(temp1+1); printf("1/%d\n",temp2); a=n*temp2-m*1;//新分子 b=m*temp2;//新分母 int temp=maxComDiv(a,b); n=a/temp; m=b/temp; if(n==1){ printf("%d/%d\n",n,m); } } return 1; } int maxComDiv(int num1,int num2){ //求最大公约数 int temp=0; while(num1!=0){ temp=num2%num1; num2=num1; num1=temp; } return num2; } int main(){ int temp=egyptFraction(3,4); if(temp){ printf("成功\n"); } else{ printf("失败\n"); } return 0; }
    Processed: 0.009, SQL: 8