基础 Python 编程的部分公式和概念总结
目录
- 一、根据年月日计算星期(蔡勒公式)
- 1. 蔡勒公式的概念
- 2. 实例
- 3. 代码
- 二、求最大公约数和最小公倍数
- 1. 概念
- 2. 求最大公约数
- 1)列举法 / 穷举法
- 2)辗转相除法 / 欧几里得算法
- 3)更相减损术
- 4)分解质因数法
- 3. 求最小公倍数
- 1)列举法 / 穷举法
- 2)用最大公约数求最小公倍数
- 3)分解质因数法
- 4. 总结与辗转相除法代码
- 三、常见公式和概念
- 1. 求三角形面积(海伦公式)
- 2. 质数 / 素数和合数
- 3. 斐波那契数列
- 4. 阿姆斯特朗数 / 水仙花数
- 5. 其他
一、根据年月日计算星期(蔡勒公式)
1. 蔡勒公式的概念
蔡勒公式(Zeller公式)是一种根据给定的年月日,快速计算某一天是星期几的数学方法。公式如下:
W = ( Y + ⌊ Y 4 ⌋ + ⌊ C 4 ⌋ − 2 C + ⌊ 13 ( M + 1 ) 5 ⌋ + D − 1 ) m o d 7 W=\bigg(Y+\Big\lfloor \frac{Y}{4} \Big\rfloor+\Big\lfloor \frac{C}{4} \Big\rfloor-2C+\Big\lfloor \frac{13(M+1)}{5} \Big\rfloor+D-1\bigg) mod 7 W=(Y+⌊4Y⌋+⌊4C⌋−2C+⌊513(M+1)⌋+D−1)mod7
该公式通过给定的年份、月份、日期,会返回一个 W 值,即一个 0 到 6 之间的数字。其中:
-
W :求解出的星期数
-
Y :年份中的后两位数(年份 mod 100)
-
C :年份中的前两位数(年份 // 100)
-
M :月份(注:3 月起算,1 月和 2 月视为 13 和 14月,同时年份减 1 )
-
D :日期(天)
-
⌊⋅⌋ :表示向下取整
W 值 | 0 | 1 | 2 | 3 | 4 | 5 | 6 |
---|---|---|---|---|---|---|---|
星期 | 星期天 | 星期一 | 星期二 | 星期三 | 星期四 | 星期五 | 星期六 |
【注】:
当月份是 1 月或 2 月时,要把 1 月当成 13 月,2 月当作 14 月,并且年份要减 1 再代入公式。
例如:1995 年 1 月 → 月份 M = 13 ,年份变为 1994 ,再拆出 C = 19 和 Y = 94 计算。
2. 实例
-
2025 年 2 月 16 日:Y = 24 ,C = 20 ,M = 14 ,D = 16
得到:W = 49 mod 7 = 0 → 星期天 -
2025 年 1 月 1 日:Y = 24 ,C = 20 ,M = 13 ,D = 1
得到:W = 31 mod 7 = 3 → 星期三 -
2025 年 5 月 8 日:Y = 25 ,C = 20 ,M = 5 ,D = 8
得到:W = 18 mod 7 = 4 → 星期四
3. 代码
# 读取任意年和月,输出对应月的日历def get_week(y, m, d):if m == 1 or m == 2:y -= 1m += 12# 计算星期:W = (Y+[Y/4]+[C/4]-2*C+[(13*(M+1))/5]+D-1) mod 7yy = y % 100c = y // 100w_result = (yy + (yy // 4) + (c // 4) - 2 * c + ((13 * (m + 1)) // 5) + d - 1) % 7return w_resultif __name__ == '__main__':year = int(input("请输入年份:"))month = int(input("请输入月份:"))# 定义一个列表,用于存储每月天数days_of_month = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]# 判断是否为闰年if (year % 4 == 0 and year % 100 != 0) or year % 400 == 0:days_of_month[1] = 29# 输出日历print("以下输出{}年{}月的日历:".format(year, month))print("Sun. Mon. Tue. Wed. Thu. Fri. Sat.")# 计算星期w = get_week(year, month, 1)# 输出空格for i in range(w):print(" ", end="")# 输出日期for i in range(1, days_of_month[month - 1] + 1):print("{:4d} ".format(i), end="")w += 1# 换行if w % 7 == 0:print()
注:根据公历的规则,闰年的判断标准主要有两个:
-
如果年份能被 4 整除但不能被 100 整除,则为闰年。
-
如果年份能被 400 整除,也是闰年。
参考文章:
【如何只根据日期计算对应的星期数】
【蔡勒(Zeller)公式及其推导:快速将任意日期转换为星期数】
二、求最大公约数和最小公倍数
1. 概念
最大公约数(Greatest Common Divisor, GCD)是指两个或多个整数共有约数中最大的一个正整数;而最小公倍数(Least Common Multiple, LCM)是指两个或多个整数共有倍数中最小的一个正整数。它们之间的关系为:最小公倍数 = 两数之积 / 最大公约数。计算最大公约数的方法包括辗转相除法等,而最小公倍数可以通过最大公约数来计算。
2. 求最大公约数
1)列举法 / 穷举法
步骤:
- 列出两个数的所有约数。
- 找出两者共有的约数。
- 取最大的那个数,即为最大公约数。
适用情况:数值较小,直观好理解。
2)辗转相除法 / 欧几里得算法
原理:两个数的最大公约数等于其中较小的那个数和两数相除余数的最大公约数。
步骤:
- 用较大数除以较小数,记余数 r 。
- 若 r = 0 ,则较小数即为最大公约数。
- 否则,用较小数和 r 继续做除法,直到余数为 0 。
公式:GCD(a, b) = GCD(b, a % b)
求 GCD(48, 18) :
48 ÷ 18 = 2 余 12
18 ÷ 12 = 1 余 6
12 ÷ 6 = 2 余 0 → GCD(48, 18) = 6
适用情况:数值大时效率高。
3)更相减损术
原理:两个数的最大公约数等于两数之差与较小数的最大公约数。
步骤:
- 用较大数减去较小数,得到差值 d 。
- 计算 GCD(d, 较小数) 。
- 重复直到两个数相等,那个数即为最大公约数。
求 GCD(48, 18) :
48 - 18 = 30
30 - 18 = 12
18 - 12 = 6
12 - 6 = 6
6 - 6 = 0 → GCD(48, 18) = 6
适用情况:原理简单,但效率不如辗转相除法。
4)分解质因数法
步骤:
- 将两个数分解成质因数的乘积。
- 取两个数分解质因数中相同因数的最小指数的乘积。
48 = 24 × 31
18 = 21 × 32
GCD(48, 18) = 21 × 31 = 6
适用情况:便于深入了解因数结构,适合手工计算或教学。
3. 求最小公倍数
1)列举法 / 穷举法
步骤:
- 列出两个数的所有倍数。
- 找出两个数共有的最小倍数。
适用情况:数较小时,直观易懂。
2)用最大公约数求最小公倍数
公式:
L C M ( a , b ) = ∣ a × b ∣ G C D ( a , b ) LCM(a,b)=\frac{\lvert a×b \rvert}{GCD(a,b)} LCM(a,b)=GCD(a,b)∣a×b∣
步骤:
- 先求得最大公约数。
- 代入上述公式计算。
已知 GCD(48, 18) = 6 ,得到 LCM(48, 18) = (48×18) / 6 = 144 。
适用情况:非常高效且常用。
3)分解质因数法
步骤:
- 将两个数分解成质因数的乘积。
- 取所有质因数的最高指数乘积。
48 = 24 × 31
18 = 21 × 32
LCM(48, 18) = 24 × 32 = 144
适用情况:可用于多个数的最小公倍数计算,便于理解质因数关系。
4. 总结与辗转相除法代码
方法 | 最适用场景 | 优缺点 | 说明 |
---|---|---|---|
列举法 | 数较小,易理解 | 简单但是效率低 | 最直观但不适合大数 |
辗转相除法 | 任何整数 | 效率高,计算快 | 最常用最大公约数计算方法 |
更相减损术 | 小数且对算法原理感兴趣 | 理解简单,但效率较低 | 古典数学方法 |
质因数分解 | 手工教学或分解质因数 | 理解深刻,可同时用于LCM计算 | 需要知道质数分解,较费时 |
用GCD求LCM | 求最小公倍数时最优 | 简便高效 | 常用快捷计算最小公倍数的方法 |
if __name__ == '__main__':a = int(input("请输入一个数:"))b = int(input("请输入一个数:"))a_copy = ab_copy = b# 辗转相除法(欧几里得算法)while a_copy % b_copy != 0:a_copy, b_copy = b_copy, a_copy % b_copyprint("最大公约数为:", b_copy)# 最小公倍数=两数之积除以最大公约数print("最小公倍数为:", a * b // b_copy)
三、常见公式和概念
1. 求三角形面积(海伦公式)
假设在平面内,有一个三角形,边长分别为 a b c ,三角形的面积 S 可由以下公式求得:
S = p ( p − a ) ⋅ ( p − b ) ⋅ ( p − c ) S=\sqrt{p(p-a)·(p-b)·(p-c)} S=p(p−a)⋅(p−b)⋅(p−c)
上述公式里的 p 为半周长(即周长的一半)
p = a + b + c 2 p=\frac{a+b+c}{2} p=2a+b+c
if __name__ == '__main__':a = float(input("请输入三角形第一条边长:"))b = float(input("请输入三角形第二条边长:"))c = float(input("请输入三角形第三条边长:"))if a + b > c and a + c > b and b + c > a:# 利用海伦公式计算p = (a + b + c) / 2area = pow((p * (p - a) * (p - b) * (p - c)), 0.5)print("三角形的面积为:", area)else:print("输入的边长不能构成三角形!")
2. 质数 / 素数和合数
-
质数(素数):指大于 1 的自然数,除了 1 和它本身外,不能被其他自然数整除的数。
例如:2、3、5、7 都是素数。 -
合数:指大于 1 的自然数,除了能被 1 和本身整除外,还能被其他数整除的数。
例如:4、6、8 都是合数。
【注】:1 既不是素数也不是合数,因为它只有一个因数。所有大于 1 且不是质数的正整数,必定是合数。
def is_prime(n):if n <= 1:return Falsefor i in range(2, n):if n % i == 0:return Falsereturn Trueif __name__ == '__main__':num = int(input('请输入一个整数:'))if is_prime(num):print('质数')else:print('非质数')
3. 斐波那契数列
斐波那契(Fibonacci)数列是一个数字序列,其中每个数字是前两个数字的总和,通常以 0 和 1 开始,形成的序列为:0、1、1、2、3、5、8、13、21、34、55、89…。
def fib(index):if index == 1:return 1elif index == 2:return 1else:return fib(index - 1) + fib(index - 2)if __name__ == '__main__':# 递归实现num = int(input("请输入一个数:"))print(0, end=' ')i = 1while fib(i) <= num:print(fib(i), end=' ')i += 1print()print('-' * 50)# 非递归实现a, b = 0, 1print(a, end=' ')while b <= num:print(b, end=' ')a, b = b, a + b
4. 阿姆斯特朗数 / 水仙花数
阿姆斯特朗数也称为水仙花数或自恋数,是一个数学概念,常用于计算机编程语言中。
要判断一个数是否为阿姆斯特朗数,首先需要确定数的位数 n ,然后计算每一位数字的 n 次方之和,最后比较这个和是否等于原数。如果相等,那么这个数就是一个阿姆斯特朗数。
例如,三位数 153 是一个阿姆斯特朗数,因为 13 + 53 + 33 = 153 。
if __name__ == '__main__':num = int(input("请输入一个数:"))n = len(str(num))temp = numresult = 0while temp > 0:digit = temp % 10result += digit ** ntemp //= 10if num == result:print(num, "是阿姆斯特朗数")else:print(num, "不是阿姆斯特朗数")
5. 其他
range()
左闭右开,random.randint()
左闭右闭。