Python算法100例-4.1 将真分数分解为埃及分数

完整源代码项目地址,关注博主私信'源代码'后可获取

  • 1.问题描述
  • 2.问题分析
  • 3.算法设计
  • 4.补充知识点
  • 5.确定程序框架
  • 6.完整的程序

1.问题描述

现输入一个真分数,请将该分数分解为埃及分数。

2.问题分析

真分数(a proper fraction)是指分子比分母小的分数,其分数值小于1。如1/2、3/5、8/9等都是真分数。

分子是1的分数,叫单位分数。古代埃及人在进行分数运算时,只使用分子是1的分数,因此这种分数也叫作埃及分数,或者叫单分子分数。例如,8/11=1/2+1/5+1/55+1/110。

我们约定分子分母都是自然数,分数的分子用a表示,分母用b表示。若真分数的分子a能整除分母b,则真分数经过化简就可以得到埃及分数,若真分数的分子不能整除分母,则可以从原来的分数中分解出一个分母为(b/a)+1的埃及分数。用这种方法将剩余部分反复分解,最后可得到结果。

3.算法设计

真分数分解为埃及分数的思路可归纳如下:

1)分数的分子用a表示、分母用b表示,变量c用来存储各个埃及分数的分母。

2)如果分母是分子的倍数,直接约简成埃及分数。此时,埃及分数的分母c=b/a,分子为1,即直接将变量a赋值为1。

3)若分母不是分子的倍数,则可以分解出一个分母为(b/a)+1的埃及分数,即变量c的值为(b/a)+1。

4)如果分子是1,表明已经是埃及分数,不用再分解,分解过程结束。

如果分数的分子a为1,则说明此时的分数已经是埃及分数,无须再分解,可结束循环。对于这种不受循环条件限制,当某一条件满足时便可结束循环的情况,可用break语句实现。

if a == 1:
    print("1/%ld\n" %c, end="")
    break


5)如果分子是3而且分母是偶数,直接分解成两个埃及分数1/(b/2)和1/b。

因分母为偶数,故变量b一定是2的倍数,对于分解出来的分数1/(b/2)经过约分之后肯定能得到一个埃及分数。原分数分解为两个埃及分数之后便可利用break语句结束循环。

if a == 3 and b % 2 == 0:       # 若余数分子为3,分母为偶数,输出最后两个埃及分数
    print("1/%ld + 1/%ld\n" %(b//2, b))
    break

6)从分数中减去这个分母为(b/a)+1的埃及分数,回到步骤2重复上述过程。

分解出此埃及分数之后用原分数a/b减去此埃及分数,得到新的分数。此新分数的分子a=ac-b,分母b=bc。

整个程序没有明确的循环条件,故为了能使循环继续,需将循环条件用一非0的常量表示条件为真。从上述过程可以看出,虽然利用循环条件不能结束循环,但当满足某一条件时利用break语句,仍然可以避免程序进入死循环。

将某一真分数分解为一个以上的埃及分数后,输出时要求以各分数相加的形式输出,故在输出语句中“+”是作为普通字符输出的。

print("1/%ld + " %c, end="")


4.补充知识点

(1)print()函数

print()函数的一般调用形式为:

print(格式控制  %输出表列)

也可以省略格式控制,直接输出。

格式说明符用于为输出项提供输出格式说明,也就是使数据按格式说明符的要求进行输出,其由%号和紧跟在其后的格式描述符组成。

部分常用的格式说明符及其描述如表所示。

在双引号中除了格式说明符之外的内容要全部原样输出;输出表列中各个输出项之间要用逗号隔开;输出项可以是任意合法的常量、变量或表达式。

在这里插入图片描述

注意事项:

·输出比较自由一些,输出的各个数之间到底是什么,取决于格式说明符之间的内容。

·格式说明符要与输出项一一对应。

·输出语句中还可以有\n、\r、\t、\a等转义字符。

·尽量不要在输出语句中改变输出变量的值。

·输出的数据中如果存在变量,一定是已经定义过的。

(2)不换行输出

在使用print()函数时,它会自动打印一个换行符。如果不想换行或不想自动添加换行符,可以在print()函数中加上参数end=" "来避免换行,其中end参数的双引号中可以添加任意字符,实现在打印的结果后面添加任意字符。

实例代码:

# @desc: print()函数

if __name__ == "__main__":

    pi = 3.141592657
    # 输出整数部分
    print("%d" %pi)
    # 指定占位符宽度,输出整数部分
    print("%5d" % pi)
    # 指定占位符宽度,左边补0,输出整数部分
    print("%05d" %pi)
    # 指定占位符宽度,右对齐,输出整数部分
    print("%-5d" %pi)

    # 保留2位小数
    print("%.2f" % pi)
    # 指定占位符,并保留3位小数
    print("%6.3f" %pi)
    # 指定占位符,并保留4位小数,左边补0
    print("%06.4f" %pi)
    # 指定占位符,保留2位小数,左边补0,始终带符号
    print("%+05.2f" %pi)

    # 使用科学记数法表示
    print("%e" %pi)

    # 输出字符串
    str = "HelloWorld!"
    print("str = %s" %str)
    # 也可以省略格式说明,直接输出
    print("str = " , str)
    # 保留3个字符
    print("%.3s" %str)

    # 输出字符
    str1 = 'a'
    print("str1 = %c" %str1)

    print("-------------")
    for i in range(3):
        print(i)                                    # 换行输出

    for i in range(3):
        print(i, end=" ")                           # 不换行输出
3
    3
00003
3    
3.14
 3.142
3.1416
+3.14
3.141593e+00
str = HelloWorld!
str =  HelloWorld!
Hel
str1 = a
-------------
0
1
2
0 1 2 

5.确定程序框架

程序流程图如图所示。

在这里插入图片描述

6.完整的程序

根据上面的分析,编写程序如下:

# @desc: 将真分数分解为埃及分数

if __name__ == "__main__":
    print("请输入一个分数:", end=" ")
    a, b = [int(i) for i in input().split()]
    print("输入的分数为:%ld/%ld" %(a, b))
    print("埃及分数:", end=" ")
    while 1:
        if b % a != 0:  # 若分子不能整除分母,则分解出一个分母为b//a+1的埃及数
            c = b // a + 1
        else:
            c = b // a
            a = 1
        if a == 1:
            print("1/%ld\n" %c, end="")
            break
        else:
            print("1/%ld + " %c, end="")
        a = a * c - b   # 求出余数的分子
        b = b * c  # 求出余数的分母
        if a == 3 and b % 2 == 0:  # 若余数分子为3,分母为偶数,输出最后两个埃及数
            print("1/%ld + 1/%ld\n" %(b//2, b))
            break
请输入一个分数: 输入的分数为:3/5
埃及分数: 1/2 + 1/10

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/463721.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

vulture,一个有趣的 Python 死代码清除库!

目录 前言 什么是 Python Vulture 库? 核心功能 使用方法 1. 安装 Vulture 库 2. 使用 Vulture 命令行工具 3. 定制规则 实际应用场景 1. 代码库维护 2. 项目迁移和重构 3. 优化性能 4. 代码审查和质量检查 总结 前言 大家好,今天为大家分享一个好…

ideaSSM社区二手交易平台C2C模式开发mysql数据库web结构java编程计算机网页源码maven项目

一、源码特点 idea ssm 社区二手交易平台系统是一套完善的完整信息管理系统,结合SSM框架完成本系统SpringMVC spring mybatis ,对理解JSP java编程开发语言有帮助系统采用SSM框架(MVC模式开发),系统具有完整的源代码…

QML 添加扩展插件QQmlExtensionPlugin

一.添加QQmlExtensionPlugin方式步骤 目的:界面跨软件复用。 项目目录结构如下图: 1.首先,创建一个继承自QQmlExtensionPlugin的类,例如MyPlugin。在这个类中,实现registerTypes()和initializeEngine()方法。 #ifndef …

esp8266调试记录

连接笔记本电脑 使用笔记本电脑的USB接口为NodeMCU开发板供电,你需要确保电压和电流在安全范围内。虽然NodeMCU的输入输出电压限制为3.3V,但是大多数开发板都内置了电压调节器,可以从5V的USB电源降压到3.3V。因此,通常情况下&…

暄桐二期《集字圣教序》21天教练日课又跟大家见面啦

林曦老师的直播课,是暄桐教室的必修课。而教练日课是丰富多彩的选修课,它会选出书法史/美术史上重要的、有营养的碑帖和画儿,与你一起,高效练习。而且暄桐教练日课远不止书法、国画,今后还会有更多有趣的课程陆续推出&…

Ubuntu 22.04 Nvidia Audio2Face Error:Failed to build TensorRT engine

背景 1.在Ubuntu22.04上安装Audio2Face后启动,嘴形不会实时同步。控制台显示如【图一】: 【图一】 2.log日志如下: Error: Error during running command: [‘/home/admin/omniverse/libs/deps/321b626abba810c3f8d1dd4d247d2967/exts/omni.audio2fac…

科研学习|论文解读——了解在线环境中的多数观点形成过程:Facebook的探索性方法(IPM, 2018)

论文标题 Understanding the majority opinion formation process in online environments: An exploratory approach to Facebook 摘要 在在线社区的社会互动过程中,多数观点经常被观察到,但很少有研究用实证数据来解决这一问题。为了确定一个合适的理论…

大模型Gemini 1.5 Pro之我的体验

前言 最近我有幸获得了 Gemini 1.5 Pro 的内测资格,想在这里分享一下我的使用体验。这篇文章并非旨在横向比较各家模型的优劣,也不是探讨 Gemini 的迭代历程。因此,我不会过多关注哪些功能是上一代模型已经实现的,或者哪些是完全…

Java Spring Boot搭配MyBatis的项目开发中关于账户余额并发更新

在Java Spring Boot搭配MyBatis的项目开发中,涉及到多个功能模块同时操作同一数据库表字段(例如用户账户余额)时,为了保证数据的一致性和防止更新过程中的错误(例如余额错账、更新丢失等),需要采…

【TB作品】MSP430,波形发生器,单片机,Proteus仿真

文章目录 题目效果梯形波100个点产生方法锯齿波100个点产生方法c代码和proteus仿真 题目 114 波形发生器的制作 设计要求 设计一个能产生正弦波、方波、三角波、梯形波、锯齿波的波形发生器。设置5个开关K1~K5(从 上到下),分别对应正弦波、方波、三角波、梯形波、锯齿波,按一下…

大模型知识积累——幻觉

什么是大模型幻觉 在大语言模型的文本生成场景下,幻觉是指一本正经的胡说八道。逻辑连贯的自然表述中,有理论或者事实错误,捏造事实等问题。 幻觉问题的危害 LLM幻觉可能产生传播错误知识的后果。对于医疗应用中结果安全和可信AI尤为重要&a…

Android 系统的启动过程

Android 系统的启动流程: RomBoot(只读存储器引导程序):这是设备上电时运行的初始软件。RomBoot执行基本的硬件初始化,确保硬件处于可以运行后续启动阶段的状态。这一阶段非常重要,因为它为整个启动过程奠定…

部署 JimV 私有云

server1 控制节点计算节点192.168.136.131server2 计算节点192.168.136.132 准备环境 基础系统 Centos7 (确保关闭防火墙 禁用SELinux) 私有云平台JimV-3.10.2-x86_64-DVD-240129-CentOS72009.iso 离线安装 将Jimv的镜像上传到server1上 并将其挂载…

Linux之shell循环

华子目录 for循环带列表的for循环格式分析示例shell允许用户指定for语句的步长,格式如下示例 不带列表的for循环示例 基于C语言风格的for循环格式示例注意 while循环格式示例 until循环作用格式示例 循环控制breakcontinue详细语法示例 循环嵌套示例 for循环 for循…

字典树 [Tire]

数据结构、算法总述:数据结构/基础算法 C/C_禊月初三的博客-CSDN博客 字典树,英文名 trie。顾名思义,就是一个像字典一样的树。 Trie 树是一种多叉树的结构,它的特点是所有的字符都存储在树的分支上,并且从根节点到某…

最详细爬虫零基础教程03——Request库的介绍

文章目录 前言一、Request库的使用?二、响应Response中的属性3.用户代理(User-Agent) 前言 Request库是一个Python的第三方库,用于发送HTTP请求和处理HTTP响应。它提供了简单而方便的接口,使得发送HTTP请求变得容易。…

OpenCV(七)——灰度图像的阙值处理以及图像的边界填充

灰度图像的阙值处理 在OpenCV中利用threshold()对灰度图像进行阙值处理,该函数通过将图像中的每个像素值与一个给定的阈值进行比较来工作。如果像素值超过这个阈值,那么像素值将被设置成指定的最大值;如果没有超过阈值,则根据不同…

C语言例:设 int a=11; 则表达式 a+=a-=a*a 的值

注&#xff1a;软件为VC6.0 代码如下&#xff1a; #include<stdio.h> int main(void) {int a11, b;b (aa-a*a); //a*a121 -->a-121结果为a-110 -->a-110结果为a-220printf("表达式aa-a*a 的值为&#xff1a; %d\n",b);return 0; } //优先级&#x…

组播协议详解

1.组播基础 &#xff08;1&#xff09;组播简介 &#xff08;2&#xff09;组播的地址 &#xff08;3&#xff09;组播的MAC地址 &#xff08;4&#xff09;组播的MAC地址 &#xff08;5&#xff09;反向转发路径—RPF 2.IGMP &#xff08;1&#xff09;简介 &#xff0…

vite ts vue 项目提示 . Projects must list all files or use an include pattern.

vite ts vue 项目提示 . Projects must list all files or use an include pattern. 在引用一个 ts 的时候&#xff0c;提示如下&#xff1a; 需要在 tsconfig.node.json 文件中添加&#xff1a; {"compilerOptions": {"composite": true,"skipLibC…
最新文章