FCTRL - Factorial的python实现

本文介绍了一种优化算法,用于快速计算给定整数阶乘的末尾零数量,针对大数值(最高达10亿)进行了性能优化。

题目说明

该题目来源于SPOJ:http://www.spoj.com/problems/FCTRL/
大体意思是给定一个数n,求n的阶乘有多少个0结尾。
由于n最大可以是1000000000,笔者初步的算法1,虽然相比整个n遍历一次O(n)时间复杂度减少了80%,但还是无法满足需求;于是有了算法2;
算法2使用递归实现,对于n = 1000000000,只需要递归12次就可以结束,时间复杂度上大大降低。

算法1

0的产生只能是5的倍数乘以2,也就是5*n*2,而偶数的数量在50%左右,因此不缺2,只缺5;因此只需要找到5或5的倍数的个数,就可以知道0的个数了。
定义0计数器count = 0
定义mod5(n)函数返回n能被5整除的次数;
1、n小于5时,count = 0直接返回;
2、n大于等于5时,从5开始遍历n,间隔为5,也就是遍历的顺序是5,10,15,20..,n-n%5;count +=mod5(i)
3、遍历结束后输出count就是0的个数。

算法2

通过算法1可以发现,对于给定的正整数N,去算0的个数,只需要用所有5的倍数乘起来去算即可,定义:
a(n) = 5n
当n>1时,s(n) = s(n-1)*a(n)
推出s(n) = (1*5)*(2*5)(3*5)*...*(n*5) = 5^n * n!
所以对于给定的正整数N,N!当中所有5的乘积可以简化为N! ~  5^(N/5)*(N/5!);
看到上面的式子,就应该想到递归了,完整递归定义:
当n<5时,Z(n)  =  0
当n=5时,Z(n)  =  1
当n>5时,Z(n)  =  n/5 + Z(n/5)


算法2代码实现

def z(n):
	if n < 5:
		return 0
	elif n == 5:
		return 1
	else:
		return z(n/5)+n/5
line = input()
for t in range(line):
	n = input()
	print(z(n))


<think>好的,用户是一个Python新手,想要了解如何在不同环境中输入和运行Python代码的详细步骤。用户之前的问题是关于Blender中非渲染历史数据查询的操作步骤,现在转向更基础的Python代码输入方法。需要结合用户提供的引用内容,特别是引用[2]、[4]、[5]提到的cmd、IDLE和VSCode环境,以及手动添加环境变量的注意事项(引用[1])。用户可能对如何开始编写第一个Python程序感到困惑,需要分步骤指导。首先,要确保用户已经正确安装Python并配置了环境变量,这点在引用[1]中提到过,如果安装时没勾选,需要手动添加。然后,根据引用[2]和[5],用户可能需要使用cmd和IDLE这两种基础工具,而引用[4]建议使用VSCode作为更高效的开发环境。需要分不同环境详细说明步骤,比如命令行、IDLE、VSCode,可能还要提到Jupyter Notebook,因为新手常用。 用户可能遇到的困难包括如何启动不同的环境、如何保存文件、如何运行代码。需要详细说明每一步操作,比如在IDLE中如何新建文件、保存、运行,在VSCode中安装扩展、配置环境等。同时,要强调基础操作,比如打印“Hello World”,让用户有成就感。还要注意引用中的链接和资源,比如引用[3]的项目地址,引用[4]提到的B站学习视频和书籍,可以在回答中适当推荐,帮助用户进一步学习。最后,生成相关问题时要围绕用户可能遇到的后续问题,比如环境配置错误、代码无法运行、选择开发工具等。</think>### Python代码输入环境操作指南(新手指南) #### 一、环境准备 1. **验证Python安装** 在cmd中输入以下命令检查版本: ```bash python --version ``` 若显示类似`Python 3.9.6`表示安装成功[^1] 2. **环境变量配置** - 若安装时未勾选"Add Python to PATH",需手动添加: `控制面板 > 系统 > 高级系统设置 > 环境变量 > Path > 新建` 添加Python安装路径(如:`C:\Python39`)和Scripts路径(如:`C:\Python39\Scripts`)[^1] #### 二、不同环境代码输入方法 ##### 方法1:命令行交互模式 ```bash # 启动环境 python # 输入代码 >>> print("Hello World") # 立即执行 >>> 2 + 3 * 5 # 数学运算 ``` ##### 方法2:IDLE编辑器 1. 通过开始菜单打开`IDLE` 2. 新建文件:`File > New File`(快捷键`Ctrl+N`) 3. 输入代码示例: ```python def greet(name): print(f"Hello, {name}!") greet("Alice") ``` 4. 保存文件:`File > Save`(扩展名必须为`.py`) 5. 运行代码:`Run > Run Module`(快捷键`F5`)[^5] ##### 方法3:VSCode开发环境 1. 安装Python扩展: 打开扩展商店搜索`Python`,安装Microsoft官方扩展 2. 创建新文件:`File > New File`,保存为`.py`文件 3. 输入代码示例: ```python # 计算斐波那契数列 def fibonacci(n): a, b = 0, 1 for _ in range(n): print(a, end=' ') a, b = b, a + b fibonacci(10) ``` 4. 运行方式: - 右键选择`Run Python File in Terminal` - 使用调试按钮(需配置launch.json)[^2] ##### 方法4:Jupyter Notebook ```python # 在单元格中输入代码后按Shift+Enter执行 import matplotlib.pyplot as plt import numpy as np x = np.linspace(0, 2*np.pi, 100) plt.plot(x, np.sin(x)) plt.show() ``` #### 三、代码输入规范 1. **缩进规则** Python使用4个空格缩进表示代码块层级: ```python if x > 0: print("正数") # 缩进4空格 else: print("非正数") ``` 2. **数学运算示例** ```python # 解二次方程 $ax^2 + bx + c = 0$ a, b, c = 1, -3, 2 delta = b**2 - 4*a*c # 计算判别式 $Δ = b^2 - 4ac$ x1 = (-b + delta**0.5)/(2*a) x2 = (-b - delta**0.5)/(2*a) ``` #### 四、调试技巧 1. **常见错误处理** - `SyntaxError`: 检查冒号、括号配对 - `IndentationError`: 统一使用空格缩进 - `NameError`: 确认变量已定义 2. **断点调试** 在VSCode中点击行号左侧设置断点,按`F5`启动调试: ```python def factorial(n): result = 1 for i in range(1, n+1): # 在此行设置断点 result *= i return result print(factorial(5)) # 查看变量变化过程 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值