博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
贪心入门之——埃及分数问题
阅读量:3958 次
发布时间:2019-05-24

本文共 972 字,大约阅读时间需要 3 分钟。

贪心入门之——埃及分数问题

问题描述:

古埃及人喜欢用最少的分子为1的真分数来表示一个真分数,比如7/8=1/2+1/3+1/24

那么算法上应该怎么实现呢?

假设现在我们需要求解真分数A/B(A与B不可约),那么假设
B=AC+D;那么B/A=C+D/A<C+1;那么A/B>1/(C+1);则按照我们贪心的思想的话1/(C+1)为A/B分解中最大的那个分子为1的真分数。那么我们假设E=(C+1);那么相减以后得到A/B-1/E=(AE-B)/BE;那么得到新的A=AE-B,B=B*E,然后对新的A/B进行约分(采用欧几里得算法)。如此循环我们最后就会得到当A=1是表明结束循环。
代码实现:

import org.junit.Test;public class Main {
void EgyptFraction(int A,int B){
System.out.print(A+"/"+B+"="); int E,R; while(A!=1){
E = B/A+1; System.out.print("1/"+E+"+"); A = A*E-B; B = B*E; R = Gcd(A,B); if(R>1){
A/=R; B/=R; } } System.out.println("1/"+B); } int Gcd(int A,int B){
while(B!=0){
int temp = A; A=B; B=temp%B; } return A; } @Test public void Test(){
EgyptFraction(7,8); }}

在这里插入图片描述

复杂度分析:

O(B)(按最坏情况看,必须A/B分解为A个1/B)

转载地址:http://qvlzi.baihongyu.com/

你可能感兴趣的文章
linux数据库导出结果集且比对 && grep -v ---无法过滤的问题
查看>>
shell函数与自带变量
查看>>
linux下shell获取不到PID
查看>>
sort详解
查看>>
linux,shell中if else if的写法,if elif
查看>>
shell中单引号、双引号、反引号的区别
查看>>
shell脚本死循环方法
查看>>
shell中$*和$@的区别
查看>>
log4cxx 的编译安装过程和使用
查看>>
简单邮件系统程序
查看>>
STL里的multimap使用详解
查看>>
STL 库其中的 std::string用法总结
查看>>
模态对话框的销毁过程与非模态对话的几种销毁方法
查看>>
C++实现http下载 && 24点计算编码风格
查看>>
memcached了解使用和常用命令详解
查看>>
GDB调试各功能总结
查看>>
"undefined reference to" 多种可能出现的问题解决方法
查看>>
类结构定义
查看>>
Windows下关于多线程类 CSemaphore,CMutex,CCriticalSection,CEvent,信号量CSemaphore的使用介绍
查看>>
图像处理基本算法(汇总)以及实现
查看>>