当前位置: 首页 > news >正文

基础 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+4C2C+513(M+1)+D1)mod7
该公式通过给定的年份、月份、日期,会返回一个 W 值,即一个 0 到 6 之间的数字。其中:

  • W :求解出的星期数

  • Y :年份中的后两位数(年份 mod 100)

  • C :年份中的前两位数(年份 // 100)

  • M :月份(注:3 月起算,1 月和 2 月视为 13 和 14月,同时年份减 1 )

  • D :日期(天)

  • ⌊⋅⌋ :表示向下取整

W 值0123456
星期星期天星期一星期二星期三星期四星期五星期六

【注】:

当月份是 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(pa)(pb)(pc)
上述公式里的 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() 左闭右闭。
http://www.xdnf.cn/news/345925.html

相关文章:

  • sherpa:介绍
  • LeetCode:翻转二叉树
  • DLMS协议 —— System title 详解(作用及结构一览)
  • C——操作符详解
  • 广州AI数字人:从“虚拟”走向“现实”的变革力量
  • HOW - 在 Mac 上的 Chrome 浏览器中调试 Windows 场景下的前端页面
  • 《React Native热更新实战:用Pushy打造无缝升级体验》
  • systemd vs crontab:Linux 自动化运行系统的全面对比
  • 深入理解栈数据结构(Java实现):从原理到实战应用
  • LeetCode[226] 翻转二叉树
  • 基于Qt开发的http/https客户端
  • 电子电气架构 --- 如何有助于提安全性并减少事故
  • FEKO许可限制
  • OpenCV 中用于背景分割的一个类cv::bgsegm::BackgroundSubtractorLSBP
  • 芯片笔记 - 手册参数注释
  • Spring Security(笔记)
  • 第37次CCF--机器人饲养
  • C语言自定义类型:联合与枚举详解
  • QT中的网络请求
  • Pycharm安装后打开提示:此应用无法在你的电脑上运行,若要找到合适于你的电脑的版本,请咨询发布者
  • 如何选择自己喜欢的cms
  • 【Unity中的数学】—— 四元数
  • 实时操作系统:航空电子系统的安全基石还是创新枷锁?
  • std::iota(C++)
  • 年龄估计数据集
  • 【工具推荐】Code2Prompt
  • 【HarmonyOS 5】鸿蒙页面和组件生命周期函数
  • 【软件设计师:软件工程】11.项目管理
  • C++算法(19):整数类型极值,从INT_MIN原理到跨平台开发实战
  • java每日精进 5.08【框架之数据权限补充】