Python算法100例-3.8 黑洞数

  • 1.问题描述
  • 2.问题分析
  • 3.算法设计
  • 4.比较三个数的大小并将其重组
  • 5.寻找“黑洞数”
  • 6.完整的程序

1.问题描述

编程求三位数中的“黑洞数”。

黑洞数又称陷阱数,是指任何一个数字不全相同的整数,在经过有限次“重排求差”操作后,总会得到某一个或一些数,这些数即为黑洞数。“重排求差”操作是将组成一个数的各位数字重排,将得到的最大数减去最小数。例如,207的“重排求差”操作序列是:720-027=693,963-369=594,954-459=495,此时再进行“重排求差”操作不会发生改变。再用208计算一次,也是停止到495,所以495是三位黑洞数。

2.问题分析

根据“黑洞数”定义,对于任意一个数字不全相同的整数,最后结果总会掉入到一个黑洞圈或黑洞数里,最后结果一旦为黑洞数,无论再重复进行多少次的“重排求差”操作,结果都是一样的,因此可把结果相等作为判断“黑洞数”的依据。

3.算法设计

过程如下:

1)将任意一个三位数进行拆分。

2)拆分后的数据重新组合,将可以组合的最大值减去最小值,差值赋给变量j。

3)将当前差值暂存到另一变量h中:h=j。

4)对变量j执行拆分、重组、求差操作,差值仍然存储到变量j中。

5)判断当前差值j是否与前一次的差值h相等,若相等,则将差值输出并结束循环,否则重复步骤3~5。

4.比较三个数的大小并将其重组

求“黑洞数”的关键是求出拆分后所能组成的最大值max和最小值min,求最大值和最小值的关键是找出拆分后数值的大小关系,通过比较找出最大值、次大值及最小值。三个数比较大小可以采用两两比较的方法,首先a与b比较,其次a与c比较,最后b与c比较。比较顺序很重要,有时比较顺序不一样得到的结果也是不一样的。在比较过程中如需对两个数进行交换,则需借助中间变量t来实现,否则变量中存储的数将被改变。如“a=b;b=a;”,第一个语句执行完毕后变量a的值由原值变为b的值,第二个语句的作用是把现在a的值赋给b,但此时a中存储的已经不再是原来的值,而是被赋予的b值。

比较后数值按照从大到小的顺序分别存储在变量a、b、c中,再按一定的顺序重新组合成最大值和最小值。因求最大值和最小值的操作在程序中不止一次用到,故可定义两个函数three_max(a,b,c)和three_min(a,b,c),功能分别是求由三个数组成的最大值和最小值。代码如下:

# 求三位数的组合最大值
def three_max(a, b, c):         # a、b、c分别对应百位、十位、个位if a < b:                            # 如果a<b,则将变量a、b的值互换t = aa = bb = tif a < c:t = aa = cc = tif b < c:t = bb = cc = treturn a*100 + b*10 + c

函数three_min(a,b,c)的代码与以上代码的不同之处在于最后的返回值,函数three_min(a,b,c)中需返回的是最小值c100+b10+a。

5.寻找“黑洞数”

将第一次得到的差值j赋给变量h,因在后面的编程过程中会再次将得到的差值赋给变量j,为避免j中存储的原值找不到,故先把前一次的差值暂存到另一个变量h中。在比较过程中一旦两次结果相等,循环过程即可结束,可用break语句实现。判定条件j==h可以在循环体中用if语句实现,也可写在while语句中。寻找“黑洞数”的方法代码如下:

# 求黑洞数
def black_number(max, min):j = max - mink = 0while k < min:                                               # k控制循环次数h = j                                                       # h记录上一次最大值与最小值的差hun = j // 100                                      # 百位ten = j % 100 // 10                                 # 十位bit = j % 10                                        # 个位max = three_max(hun, ten, bit)      # 最大值min = three_min(hun, ten, bit)      # 最小值j = max - minif j == h:                                                  # 最后两次差相等时,差即为所求黑洞数print("%d " % j)break                                           # 跳出循环k += 1

6.完整的程序

完整的程序如下:

%%time
# 黑洞数# 求三位数的组合最大值
def three_max(a, b, c):  # a,b,c分别对应百位十位个位if a < b:  # 如果a<b,将变量a、b的值互换t = aa = bb = tif a < c:t = aa = cc = tif b < c:t = bb = cc = treturn a*100 + b*10 + c#求三位数的组合最小值
def three_min(a, b, c):  # a,b,c分别对应百位十位个位if a < b:  # 如果a<b,将变量a、b的值互换t = aa = bb = tif a < c:t = aa = cc = tif b < c:t = bb = cc = treturn c*100 + b*10 + a# 求黑洞数
def black_number(max, min):j = max - mink = 0while k < min:  # k控制循环次数h = j  # h记录上一次最大值与最小值的差hun = j // 100  # 百位ten = j % 100 // 10  # 十位bit = j % 10  # 个位max = three_max(hun, ten, bit)  # 最大值min = three_min(hun, ten, bit)  # 最小值j = max - minif j == h:  # 最后两次差相等时,差即为所求黑洞数print("%d " % j)break  # 跳出循环k += 1if __name__ == "__main__":i = int(input("请输入一个三位整数:"))print(f'输入的数字为:{i}')hun = i // 100   # 百位ten = i % 100 // 10   # 十位bit = i % 10   # 个位max = three_max(hun, ten, bit)  # 最大值min = three_min(hun, ten, bit)  # 最小值print("max = ", max)print("min = ", min)black_number(max, min)
输入的数字为:108
max =  810
min =  18
495 
CPU times: user 21.2 ms, sys: 10 ms, total: 31.2 ms
Wall time: 2.94 s

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

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

相关文章

【Yarn】error Command failed. Exit code: 1

报错代码 success Installed "create-vue3.9.2" with binaries:- create-vue C:\Program 不是内部或外部命令&#xff0c;也不是可运行的程序 或批处理文件。 error Command failed. Exit code: 1 Command: C:\Program Files\nodejs\node_global\bin\create-vuelate…

【语法】C++学习

注意 使用devc对vector初始化使用vector v1 {1, 2, 3, 4, 5}; 报错 解决 在编译器选项中加入以下代码 -static-libgcc -stdc11

Vue3搭建后台管理系统模板

1、搭建后台管理系统模板 1.1项目初始化 从0开始搭建一个vue3版本的后台管理系统。一个项目要有统一的规范&#xff0c;需要使用eslintstylelintprettier来对我们的代码质量做检测和修复&#xff0c;需要使用husky来做commit拦截&#xff0c;需要使用commitlint来统一提交规范…

wince+gprs拨号上网总结

一、硬件连接 本次调试的GPRS模块引脚定义 三星主板全功能扩展串口2引脚定义 因GPRS模块可以和pc机直连进行数据通讯&#xff0c;那么收发肯定内部交叉&#xff0c;故主板和GPRS的连接也采用直连方式。如果接线不对则出现没有回应现象&#xff0c;拨号时出现端口不可用&#xf…

反向代理多级多机

一 架构图 本次实验需要 5台机器 第一台 nginx 只做代理服务器 负责反向代理 加 负载均衡 后面的两台nginx 做真实服务器 处理静态资源 再后面的 tomcat 做真实服务器 处理动态资源 二 具体实验 &#xff08;一&#xff09; 具体实验环境 所有机器关闭防火墙 安装…

⁴ 在CSDN最火爆的AI话题是这些

CSDN当前AI最热点的文章生成方面的话题是自然语言处理&#xff08;NLP&#xff09;领域中的预训练语言模型&#xff0c;特别是GPT-3模型。 GPT-3&#xff08;Generative Pre-trained Transformer 3&#xff09;是由OpenAI开发的一种基于Transformer架构的大规模预训练语言模型。…

超越脆弱性:用否定法策略优化考研复试准备

很多情况下,你的想象力会为当前的世界添加一些东西。很抱歉,我会在本章中告诉你,这种方法完全是落后的方法:根据脆弱性和反脆弱性的概念,严格来说,正确的想象就是从未来中排除或削减不属于未来的东西,采用否定法,脆弱的事物终将破碎。——《反脆弱:从不确定性中获益》…

System.currentTimeMillis()用法以及计算方式

System.currentTimeMillis()的作用是返回当前的计算机时间&#xff0c;格式为当前计算机时间和GMT时间(格林威治时间)1970年1月1号0时0分0秒所差的毫秒数 比如在做项目时,需要统计下gc操作的执行的消耗时间 除此之外,还可以获取当前的系统时间 //直接把这个方法强制转换成dat…

python创建和上传自己的PyPI库

文章目录 创建和上传自己的PyPI库pypi准备文件制作PyPI包在上传前&#xff0c;先本地验证注册PyPI账户上传pypi判断python包质量之 SourceRankLibraries.io 参考 创建和上传自己的PyPI库 pypi 官方地址&#xff1a;https://pypi.org/ Python中我们经常会用到第三方的包&…

论文阅读:SDXL Improving Latent Diffusion Models for High-Resolution Image Synthesis

SDXL Improving Latent Diffusion Models for High-Resolution Image Synthesis 论文链接 代码链接 介绍 背景&#xff1a;Stable Diffusion在合成高分辨率图片方面表现出色&#xff0c;但是仍然需要提高本文提出了SD XL&#xff0c;使用了更大的UNet网络&#xff0c;以及增…

javaSwing飞机大战

概述 1.1 项目简介 本次Java课程设计是做一个飞机大战的游戏&#xff0c;应用Swing编程&#xff0c;完成一个界面简洁流畅、游戏方式简单&#xff0c;玩起来易于上手的桌面游戏。该飞机大战项目运用的主要技术即是Swing编程中的一些窗口类库、事件监听以及贴图技术。 1.2 实…

[C++] 万能引用+引用折叠+完美转发

文章目录 万能引用/通用引用&#xff08;universal reference&#xff09;引用折叠完美转发&#xff08;std::forward&#xff09; 万能引用/通用引用&#xff08;universal reference&#xff09; C11增加了右值的概念&#xff0c;在模板中&#xff0c;可以用&&来表示…

【个人账号体系设计】偏个人功能类账号功能模块设计

本文讨论了针对以个人功能为主的业务系统的账号能力设计&#xff0c;包括账号管理的总体需求、关键属性和设计要点。重点在于如何通过细致的设计实现账号的有效管理和安全性&#xff0c;确保系统既便于用户操作又能维持管理的严密性。 文章目录 需求能力模块设计 需求能力 在进…

python 继承类之细节抽象类之实例化做子类属性

设计者&#xff1a;ISDF工软未来 版本&#xff1a;v4.0 日期&#xff1a;2024/3/7当子类细节过多时&#xff0c;可以再抽象一个类&#xff0c;并将类的实例作为子例的属性&#xff0c;这样子类可以通过.某类.方法去执行class Car:用户类def __init__(self,make,model,year):#类…

嵌入式学习35-网络通信UDP聊天及TCP

题目&#xff1a;基于UDP实现直播间聊天的功能 需求&#xff1a; 软件划分为用户客户端和主播服务端两个软件client.c和server.c 用户客户端负责&#xff1a; 1.接收用户的昵称 2.接收用户输入的信息&#xff0c;能够将信息发送给服务端 3.接收服…

轻量脚本语言Lua的配置与c++调用

文章目录 lua配置下载运行lua命令lua脚本的执行C++调用lua环境配置错误和警告测试c++程序lua脚本结果Lua是一种功能强大且快速的编程语言,易于学习和使用,并且可以嵌入到应用程序中。 Lua被设计成一种轻量级的可嵌入脚本语言。它被用于各种各样的应用程序,从游戏到web应用程…

计算机考研❗️这些院校(含985)性价比巨高

✅厦门大学 (985) 不歧视双非&#xff0c;全靠实力&#xff0c;校园环境还贼美 ✅重庆大学 (985) 信息公开透明&#xff0c;复试抽签 ✅北京师范大学 (985) 不歧视本科出身&#xff0c;面试抽签答题。 ✅东南大学 (985) 保护第一志愿&#xff0c;复试抽签 ✅吉林大学 (…

安捷伦DSA90254A示波器 AgilentDSA90254A

产品简介&#xff1a; •高性能实验室 •2.5 GHz 带宽 •4 个模拟通道&#xff0c;每个通道的采样率为 20 GSa/s •每个通道的数据速率为 20 Mpts 至 1 Gpts •很低的本底噪声&#xff1a;100 mV/格时为 3.01 mVrms •DSA90000A 系列示波器是以 Infiniium DSO90000A 系列…

ChatGPT:人工智能的革命与未来

引言 随着人工智能技术的飞速发展&#xff0c;ChatGPT作为OpenAI推出的一款语言模型&#xff0c;已经引起了广泛的关注和讨论。它不仅改变了我们与机器交流的方式&#xff0c;还为众多行业的发展带来了革命性的影响。本文将深入探讨ChatGPT的技术原理、应用场景以及它对未来的…

JavaEE进阶(14)Linux基本使用和程序部署(博客系统部署)

接上次博客&#xff1a;JavaEE进阶&#xff08;13&#xff09;案例综合练习——博客系统-CSDN博客 目录 程序配置文件修改和打包 构建项目并打包 分平台配置 数据准备 上传jar包到云服务器并运行 开放端口号 验证程序 如何查看日志得到报错信息 常见问题 关于Linux基…