局部变量可能会引发的错误---误判---用阶乘函数求强数的 Python 程序中遇到的问题

news2024/11/23 19:42:43

背景介绍

        今天遇到这样一个额需求:用阶乘函数求强数的 Python 程序。所谓强数,就是一个特殊数字,满足其所有数字阶乘的和应等于数字本身的条件。

问题描述

def facorial_of_number(number):
    result = 1
    for i in range(1, number + 1):
        result *= i
    return result

def is_strong_number(number):
    sum = 0
    while number > 0:
        rem = number % 10
        sum += facorial_of_number(rem)
        number //= 10
    if sum == number :
        return True
    else:
        return False

num = int(input("enter a number : "))

if is_strong_number(num):
    print("{0} is strong number".format(num))
else:
    print("{0} is not strong number".format(num))

        因为事先知道145是一个强数,但在这里边却硬是把145判定为不是强数,这就很诡异!

 

 

开启debug模式,facorial_of_number(number)运行正常,

并且is_strong_number(number)中求得的阶乘之和sum也是正确的(145),

按理说sum=145,输入的number=145,正好sum = number,

但是为什么debug的下一步会直接跳到else里?

 原因分析

        哦!明白了!心机蛙一直在摸你肚子!注意看第二张debug图:啥时候number已经偷摸摸的变为0了,而不是输入的那个number = 145,所以显然就出错了嘛!

        number作为参数传入is_strong_number()中,在函数内就作为局部变量可以操作,每一次的整除10都会使number值发生变化,这样一来,操作的就不再是原始的number值了。

问题解决

        其实这个也好解决,无非就是找一个容器把原始的number保存下来,最后再拿来用就好了,笔者在这里就是用这样的方法:

def is_strong_number(num):
    sum = 0
    number = num
    while number > 0:
        rem = number % 10
        sum += facorial_of_number(rem)
        number //= 10
    if sum == num :
        return True
    else:
        return False

        再次运行,解决!

完结撒花

        之前遇到莫名奇怪的问题的时候总觉得是程序的错,但是程序是人写的,即使是程序的错也是人的原因,冷静下来分析问题是一种非常难得的态度,希望与大家共勉。

另附

        bug 只要管他,他就会自己修复。

        希望大家的程序都能如这句话。

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

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

相关文章

如何使用Python实现遥感彩色合成?

综述 遥感影像真彩色合成是一种将多光谱遥感影像转换为真实感彩色影像的技术。它通过将不同波段的遥感数据进行组合,以模拟人眼对地物颜色的感知,从而提供更直观、更易于理解的影像信息。 库索引名:arcpy.CompositeBands_management 通过不同…

如何在window下cmd窗口执行linux指令?

1.Git:https://git-scm.com/downloads(官网地址) 2.根据自己的实际路径,添加两个环境变量 3.重启电脑

[oneAPI] 使用Bert进行中文文本分类

[oneAPI] 使用Bert进行中文文本分类 Intel Optimization for PyTorch基于BERT的文本分类模型数据预处理数据集定义tokenize建立词表转换为Token序列padding处理与mask 模型 结果OneAPI参考资料 比赛:https://marketing.csdn.net/p/f3e44fbfe46c465f4d9d6c23e38e0517…

标速高就是好?不看4K随机就别买SSD!

游戏玩家心心念念的SSD终于降到了白菜价,1TB的固态硬盘甚至比机械硬盘都便宜了,不过如果只看到动辄3000MB/s的读速,那你下单的时候还真的会被骗。 之所以这么说,是因为商品页面标注的速度都是连续读写速度,也就是直接向…

面试官:JVM是如何判定对象已死的?学JVM必会的知识!

本文已收录至GitHub,推荐阅读 👉 Java随想录 文章目录 引用计数算法可达性分析算法引用类型Dead Or Alive永久代真的"永久"吗?垃圾收集算法标记-清除算法标记-复制算法标记-整理算法标记-清除 VS 标记-整理 作为一名Java程序员&…

Autosar存储入门系列02_NVM之CRC校验及显隐式同步机制

本文框架 0.前言1. NVM中CRC校验2. NVM的显隐式同步机制2.1 隐式同步2.2 显式同步 0.前言 本系列是Autosar存储入门系列,希望能从学习者的角度把存储相关的知识点梳理一遍,这个过程中如果大家觉得有讲得不对或者不够清晰的地方,还请一定指出…

Linus对AMD的fTPM 漏洞表示”沮丧” 呼吁禁用该功能

导读AMD 的 fTPM 问题在业内众所周知,经常导致系统崩溃和卡死。Linux 的创建者 Linus Torvalds 对该功能表示失望,称其为内核的”瘟疫”。 简单回顾一下,可信平台模块(Trusted Platform Module 或 TPM)是一种安全检查…

抖音火山引擎推出免费域名DNS和公共DNS服务

抖音旗下的云计算服务火山引擎最近推出了"TrafficRoute DNS 套件"服务,其中包括两款产品,对软希网来说非常有用。 1.域名DNS: 这是一个用于网站域名的DNS服务,可以加速域名解析速度,从而提升网站的速度。如…

【100天精通python】Day42:python网络爬虫开发_HTTP请求库requests 常用语法与实战

目录 1 HTTP协议 2 HTTP与HTTPS 3 HTTP请求过程 3.1 HTTP请求过程 3.2 GET请求与POST请求 3.3 常用请求报头 3.4 HTTP响应 4 HTTP请求库requests 常用语法 4.1 发送GET请求 4.2 发送POST请求 4.3 请求参数和头部 4.4 编码格式 4.5 requests高级操作-文件上传 4.6 …

线性代数的学习和整理4: 求逆矩阵的多种方法汇总

目录 原始问题:如何求逆矩阵? 1 EXCEL里,直接可以用黑盒表内公式 minverse() 数组公式求A- 2 非线性代数方法:解方程组的方法 3 增广矩阵的方法 4 用行列式的方法计算(未验证) 5 A-1/|A|*A* &…

构建 NodeJS 影院微服务并使用 docker 部署【01/4】

图片来自谷歌 — 封面由我制作 一、说明 构建一个微服务的电影网站,需要Docker、NodeJS、MongoDB,这样的案例您见过吗?如果对此有兴趣,您就继续往下看吧。 在本系列中,我们将构建一个 NodeJS 微服务,并使用…

【排序】插入排序 希尔排序(改进)

文章目录 插入排序时间复杂度空间复杂度 代码希尔排序时间复杂度空间复杂度 代码 以从小到大排序为例进行说明。 插入排序 插入排序就是从前向后(i1开始)进行选择,如果找到在i之前(分配一个j下标进行寻找)有比array[i…

第 7 章 排序算法(2)(冒泡排序)

7.5冒泡排序 7.5.1基本介绍 冒泡排序(Bubble Sorting)的基本思想是:通过对待排序序列从前向后(从下标较小的元素开始),依次比较相邻元素的值,若发现逆序则交换,使值较大的元素逐渐从前移向后部…

手写Promise一:结构的设计

手写Promise 这里写目录标题 手写Promise手写Promise的规范手册promisesaplus官网手写Promise-结构的设计 手写Promise的规范手册promisesaplus官网 链接: 官网链接 手写Promise-结构的设计 // 手写Promsie const PROMISE_STATUS_PENDING pending //等待状态 const PROMIS…

自动驾驶仿真:基于Carsim开发的加速度请求模型

文章目录 前言一、加速度输出变量问题澄清二、配置Carsim动力学模型三、配置Carsim驾驶员模型四、添加VS Command代码五、Run Control联合仿真六、加速度模型效果验证 前言 1、自动驾驶行业中,算法端对于纵向控制的功能预留接口基本都是加速度,我们需要…

【LeetCode75】第三十四题 叶子相似的树

目录 题目: 示例: 分析: 代码: 题目: 示例: 分析: 给我们两棵二叉树,让我们判断这两棵二叉树的从左到右的叶子节点组成的叶子序列是否一致,即从左到右的叶子节点的数…

python爬虫实战零基础(2)——网页图片

网页图片的批量爬取保存 分析思路预备知识xpath用法response.text和 response.content两者的区别 代码实战请求网页内容批量图片保存 分析思路 还是基于request和xpath的爬虫代码 定位目标网址(里面图片还是很好看的 https://pic.netbian.com/4kdongman/index.html&…

漏洞指北-VulFocus靶场专栏-入门

漏洞指北-VulFocus靶场01-入门 VulFocus靶场前置条件:入门001 命令执行漏洞step1: 输入默认index的提示step2: 入门002 目录浏览漏洞step1:进入默认页面,找到tmp目录step2 进入tmp目录获取flag文件 VulFocus靶场前置条…

Linux 线程库中的接口介绍

1.pthread_create()创建线程 pthread_create()的语法形式: 参数解释: 第一个参数thread:事先创建好的pthread_t类型的参数。成功时thread指向的内存单元被设置为新创建线程的线程ID。 第二个参数attr:用于定制各种不同的线程属性…

三角形添加数--夏令营

题目 tips: 1.本题不要求正三角形输出,只要输出左下三角即可 2.这种输入三角形的,都是可以理解为左下三角形的模型,然后去写f[i][j]f[i-1][j]f[i-1][j1],写行列 3.还有双重for循环输入输出三角形,注意第二…