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

news2024/11/24 12:03:23

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

  • 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.coloradmin.cn/o/1523351.html

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

相关文章

苹果Vision Pro即将在中日韩等九国开卖 | 百能云芯

苹果公司近期透露,首款混合实境(MR)头盔「Vision Pro」即将在今年晚些时候推向更多国家销售。虽然苹果尚未公布具体的销售细节,但根据最新的外媒报道,这款高科技产品可能即将在中国、日本、韩国等九个国家开卖&#xf…

Linux字符设备驱动开发一

linux字符设备驱动 0 驱动介绍1 字符设备驱动1.1 字符设备相关概念和结构体1.2 实现简单的字符设备模块1.3 创建字符设备1.4 总结 应用程序调用文件系统的API(open、close、read、write) -> 文件系统根据访问的设备类型,调用对应设备的驱动API -> 驱动对硬件进…

STM32/GD32——FreeRTOS任务管理与相关机制

芯片选型 Ciga Device — GD32F470系列 任务管理 任务处理API 操作 API 动态任务创建 xTaskCreate 任务删除 vTaskDelete 静态任务创建 vTaskCreateStatic 挂起任务 vTaskSuspend 恢复任务 vTaskResume 任务创建 BaseType_t xTaskCreate( TaskFunction_t pxTa…

叠加积分法计算电场强度

目录 电场强度 点电荷 体电荷 面电荷 ​编辑线电荷 基础知识:静电场--电场强度-CSDN博客 电场强度 点电荷 由于电场强度与产生电场的点电荷的电荷量成正比。场与源之间的这种线性关系可以用叠加原理来计算n个点电荷所形成的电场强度,即在电场中某一…

PyTorch学习笔记之激活函数篇(一)

文章目录 1、Sigmoid函数1.1 公式1.2 对应图像1.2 生成图像代码1.4 优点与不足1.5 torch.sigmoid()函数 1、Sigmoid函数 1.1 公式 Sigmoid函数的公式: f ( x ) 1 1 e − x f(x) \frac{1}{1e^{-x}} f(x)1e−x1​ Sigmoid函数的导函数: f ′ ( x ) e …

7.Java整合MongoDB—项目创建

整合MongoDB MongoDB的基本知识有所了解之后,我们开始着手上代码了,进来先来项目创建,如何引入mongodb,以及测试一下能否连接数据库。 1 新建springboot项目 其实只需要spring boot mongodb这个依赖就行,加那么多纯属…

ChatGLM3-6B独立部署提供HTTP服务failed to open nvrtc-builtins64_121.dll

背景 我在本地windoes部署ChatGLM3-bB,且希望部署后能提供HTTP server的能力。 模型部署且启动是成功了,但是在访问生成接口/v1/chat/completions时报错failed to open nvrtc-builtins64_121.dll。 问题详细描述 找不到nvrtc-builtins64_121.dll Runtime…

京瓷喷头官方参数

KJ4B-QA06NTB-STDV喷墨打印头专为高速单程、多程和多程水基油墨应用而设计。 它利用2656个直径为108mm的喷嘴,以75m/min的速度提供600dpi600dpi的分辨率。 由于采用宽印刷宽度、高密度喷嘴布置和高响应墨道设计,其生产效率和稳定性在纺织印刷、高速辊送印…

手机也能写前段代码,推荐一款万能编程软件

Python是一种强大的编程语言,广泛应用于各个领域,包括移动应用开发。如果你想在手机上进行Python编程,那么选择合适的软件工具就显得尤为重要。 一.python Pydroid 3 Pydroid 3是一款专为Android设备打造的Python IDE。它提供了一个完整的开…

【Canvas与艺术】下雪籽特效

【要点】 控制一个点的x,y坐标及下落速度&#xff0c;就能画出一个雪籽&#xff1b;创建n个雪籽&#xff0c;下雪籽的模拟效果就有了。 【效果图】 【代码】 <!DOCTYPE html> <html lang"utf-8"> <meta http-equiv"Content-Type" content…

GEC6818——QT开发之两个UI界面切换与表格显示DHT11数据

GEC6818——QT开发之两个UI界面切换与表格显示DHT11数据 使用环境: ubantu16 QT5.7 开发板GEC6818 实现要求&#xff1a; 利用A53按键1、按键2与温湿度传感器完成QT界面动态显示温湿度记录&#xff0c;并指定温湿度记录超过指定范围&#xff0c;进行报警&#xff08;LED&#…

Grass推出Layer 2 Data Rollup

Grass推出Layer 2 Data Rollup Grass邀请链接最新资讯 Grass邀请链接 欢迎使用我的邀请码进行注册: 邀请链接 如果你还不知道注册流程&#xff1a;详见Grass: 出售闲置带宽实现被动收入 最新资讯 简讯&#xff1a;2024年3月13日&#xff0c;Grass宣布正在建立基于Solana的La…

【Linux系列】计算机系统中的架构与发行版:理解与区分

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

【Linux】进程信号{初识信号/常见的信号/中断信号/信号的产生}

文章目录 0.浅谈中断信号1.初识信号2.中断信号3.信号的产生测试&#xff1a;SIGINT 4.core dump核心转储5.系统接口产生信号5.1kill给指定发5.2raise向自己发5.3abort自己给自己发6 6.由于软件条件不满足产生信号6.1SIGPIPE6.2SIGALRM 7. 硬件异常产生信号7.1除零错误7.2野指针…

Java代码基础算法练习-判断字符串是否为回文-2024.03.16

任务描述&#xff1a; 回文串是指一个正读和反读都一样的字符串&#xff0c;比如“level”或者“noon”等。要求输入 一个字符串&#xff0c;判断此字符串是否为回文。&#xff08;注&#xff1a;设字符串长度小于20&#xff09; 任务要求&#xff1a; package suanfa;import…

python--类和对象+类属性+实例属性+函数在类的调用

python--类和对象类属性实例属性函数在类的调用 类属性--创建、访问&#xff08;类、类实例&#xff09;实例属性--创建、访问&#xff08;类实例&#xff09;初始化实例属性__init__ 私有属性伪私有属性&#xff08;Pseudo-private Attributes&#xff09;私有属性&#xff08…

深入浅出理解 AI 生图模型

目录 引言 一、Stable Diffusion原理 首先 随后 最后 二、DDPM模型 1 资料 2 原理 扩散过程 反向过程 3 公式结论 三、优缺点 优点&#xff1a; 缺点&#xff1a; 四、改进与完事 LDM代表作 原理概括 Latent Space&#xff08;潜空间&#xff09; 五、总结 引…

zookeeper快速入门一:zookeeper安装与启动

本文是zookeeper系列之快速入门中的第一篇&#xff0c;欢迎大家观看与指出不足。 写在前面&#xff1a; 不影响教程&#xff0c;笔者安装zookeeper用的是WSL(windows下的linux子系统&#xff09;&#xff0c;当然你想直接在windows上用zookeeper也是可以的。 如果你也想用ws…

MinGW64 windows gcc编译器安装

下载编译好的文件包 https://sourceforge.net/projects/mingw-w64/ 打开网址 界面左上方 点File 滚轮 滚到下面 点 红框 解压 配置path 环境变量

西门子PLC常用底层逻辑块分享_调节阀

文章目录 前言一、功能概述二、调节阀程序编写1.创建自定义数据类型2.创建FC块“调节阀”3.编写程序 前言 本文分享一个自己编写的调节阀控制逻辑块。 一、功能概述 手动状态、自动状态、检修状态自由切换&#xff1b;手动状态下&#xff0c;手动输入阀门开度值&#xff1b;自…