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位小数,左边补0print("%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=" ")                           # 不换行输出
33
00003
3    
3.143.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 + 1else:c = b // aa = 1if a == 1:print("1/%ld\n" %c, end="")breakelse: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://xiahunao.cn/news/2870274.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

面向控制台编程?Java的GUI开发

记得之前刚开始学习Java,按部就班去阅读《Java核心技术》这本书的时候,总是听别人提起,java swing那一章不用看了。然后直到对着控制台编程了半年,回来捡起了Swing图形界面,跟着网上搞了坦克大战的游戏,总觉…

ECMAscript6学习

ECMAscript6介绍 ECMA是一个浏览器脚本标准制定的公司,Netscape 创造了 JavaScript 由于商标原因, 后面ECMA公司取名ECMAscript 1 发布,JavaScript 也就是 ECMAscript.到现在最新的版本是6,简称es6. 新增let 与const let 与const …

Unity在UGUI上通过绘制网格顶点自由画线

该插件的实现是使用UI组件的绘图API来动态生成和修改几何形状,可自由动态更改画线的粗细、拐角圆滑度、颜色,自由增减节点,不额外增加gameobject,并且在原生的UGUI上以ScreenSpace-Overlay的状态下,显示效果如下所示 …

每日一题:LeetCode2.两数相加

给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。 请你将两个数相加,并以相同形式返回一个表示和的链表。 你可以假设除了数字 0 之外,这两个数都不会以 0 …

C#控制台贪吃蛇

Console.Write("");// 第一次生成食物位置 // 随机生成一个食物的位置 // 食物生成完成后判断食物生成的位置与现在的蛇的身体或者障碍物有冲突 // 食物的位置与蛇的身体或者障碍物冲突了,那么一直重新生成食物,直到生成不冲突…

说说JVM的垃圾回收机制

简介 垃圾回收机制英文为Garbage Collection, 所以我们常常称之为GC。那么为什么我们需要垃圾回收机制呢?如果大家有了解过Java虚拟机运行时区域的组成(JVM运行时存在,本地方法栈,虚拟机方法栈,程序计数器,堆&#xf…

麒麟系统Redis7.2哨兵集群部署

redis哨兵集群部署 1、原理 Redis 哨兵模式是指在 Redis 集群中,有一组专门的进程(即哨兵进程)负责监控主节点和从节点的状态,并在发现故障时自动进行故障转移,以保证 Redis 集群的高可用性。 Redis 提供了哨兵的命令,哨兵命令是一个独立的进程,哨兵进程会周期性地向主…

60 个深度学习教程:包含论文、实现和注释 | 开源日报 No.202

labmlai/annotated_deep_learning_paper_implementations Stars: 44.0k License: MIT annotated_deep_learning_paper_implementations 是一个包含深度学习论文的 60 个实现/教程,附带并排注释;包括 transformers(原始、xl、switch、feedbac…

Sentaurus TCAD中SDE的mtt命令

Reflection 配套代码 ; Building mesh (sde:build-mesh "snmesh" "" "nnode_half_msh") ; Reflect the device (system:command "tdx -mtt -x -M 0 -S 0 -ren drainsource nnode_half_msh nnode_msh");----------------------------…

【洛谷 P8661】[蓝桥杯 2018 省 B] 日志统计 题解(滑动窗口+优先队列+双端队列+集合)

[蓝桥杯 2018 省 B] 日志统计 题目描述 小明维护着一个程序员论坛。现在他收集了一份“点赞”日志,日志共有 N N N 行。其中每一行的格式是 ts id,表示在 t s ts ts 时刻编号 i d id id 的帖子收到一个“赞”。 现在小明想统计有哪些帖子曾经是“热…

电脑充电器能充手机吗?如何给手机充电?

电脑充电器可以给手机充电吗? 电脑充电器可以给手机充电,但前提是电脑充电器的功率输出与手机的功率匹配且接口匹配。 假设电脑充电器的输出功率为5V/2A,手机也支持5V/2A的输入功率。 只要接口匹配,就可以使用电脑充电器给手机充…

20240314-2-字符串string

1.最长公共前缀 编写一个函数来查找字符串数组中的最长公共前缀。 如果不存在公共前缀,返回空字符串 “”。 示例 1: 输入: [“flower”,“flow”,“flight”] 输出: “fl” 示例 2: 输入: [“dog”,“racecar”,“car”] 输出: “” 解释: 输入不存在公共前缀…

玩转键盘鼠标,自动化你的电脑操作 —— 定时执行专家

简介 “定时执行专家”是一款功能强大的定时任务执行软件,除了支持常见的定时关机、重启、执行程序等功能外,还拥有模拟键盘按键和模拟鼠标操作功能,可以让你轻松实现各种自动化操作。 模拟键盘按键功能可以模拟用户的键盘输入,让…

如何用Selenium通过Xpath,精准定位到“多个相同属性值以及多个相同元素”中的目标属性值

前言 本文是该专栏的第21篇,后面会持续分享python爬虫干货知识,记得关注。 相信很多同学,都有使用selenium来写爬虫项目或者自动化页面操作项目。同样,也相信很多同学在使用selenium来定位目标元素的时候,或多或少遇见到这样的情况,就是用Xpath定位目标元素的时候,页面…

第五章、数据库6分

数据库的三级模式和两级映像图 数据模型的三要素:数据结构、数据操作、数据的完整性约束条件 数据库的三级模式和两级映像图 关系代数 函数依赖 平凡函数依赖: 规范化理论 1NF:每个属性都是不可再分的原子 2NF:不存在部分函…

MediaCodec源码分析 状态简单介绍

前言 本文分析MediaCodec.h层的状态机,下篇介绍ACodec状态机,基于7.0代码。 MediaCodec状态介绍 During its life a codec conceptually exists in one of three states: Stopped, Executing or Released. The Stopped collective state is actually the conglomeration of…

我是继续学习编程,还是学数控?

今日话题,继续学习编程,还是学数控?综合来说肯定是软件的待遇和工作环境都要好些。 当然这行有一定的技术门槛,所谓会者不难,难者不会。要入门需要一定的天赋或者说时间,当然 兴趣是最好的老师,…

快慢指针:妙解查找链表的中间结点问题

给你单链表的头结点 head ,请你找出并返回链表的中间结点。 如果有两个中间结点,则返回第二个中间结点。 示例 1: 输入:head [1,2,3,4,5] 输出:[3,4,5] 解释:链表只有一个中间结点,值为 3 。示…

基于Linux内核的socket编程(TCP)的C语言示例

原文地址&#xff1a;https://www.geeksforgeeks.org/socket-programming-cc/ 服务端&#xff1a; #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/socket.h> #include <unistd.h>#…

论文阅读——GeoChat(cvpr2024)

GeoChat : Grounded Large Vision-Language Model for Remote Sensing 一、引言 GeoChat&#xff0c;将多模态指令调整扩展到遥感领域以训练多任务会话助理。 遥感领域缺乏多模式指令调整对话数据集。受到最近指令调优工作的启发&#xff0c;GeoChat 使用 Vicuna-v1.5和自动化…