编写一个函数,计算一个整数各个数字的和,例如 输入234,输出9,因为2 + 3 + 4 = 9
def sum_digits(n):
"""
123 % 10 = 3
12 % 10 = 2
1 % 10 = 1
0
"""
def sum_digits(n):
ret = 0
while n != 0:
temp = n % 10
ret += temp
n //= 10
return ret
n = int(input("Enter n:"))
print(sum_digits(n))
编写函数,判断一个数字是否为回文数
def is_palindrome(number):
def reverse(number):
"""
num = 12321
reverse_num = 12321
num = 12345
reverse_num = 54321
"""
"""
12345 % 10 = 5
1234 % 10 = 4
123 % 10 = 3
12 % 10 = 2
1 % 10 = 1
0
# 12345 => 54321
ret = 0
ret = ret * 10 + temp
50 + 4 = 54
540 + 3 = 543
5430 + 2 = 5432
54320 + 1 = 54321
"""
def reverse(number):
ret = 0
while number != 0:
temp = number % 10
number //= 10
ret = ret * 10 + temp
return ret
def is_palindrome(number):
# 反转数字
# reverse_num = reverse(number)
# 将反转数字和原数字进行对比
return number == reverse(number)
number = int(input("Enter a number:"))
print(is_palindrome(number))
编写函数,读入三角形三边的值,若输入有效则计算面积,否则显示输入无效。
def is_valid(side1, side2, side3):
def area(side1, side2, side3):
def is_valid(s1, s2, s3):
# if s1 + s2 > s3 and s1 + s3 > s2 and s2 + s3 > s1:
# return True
# return False
return s1 + s2 > s3 and s1 + s3 > s2 and s2 + s3 > s1
def area(s1, s2, s3):
s = (s1 + s2 + s3) / 2
return (s * (s - s1) * (s - s2) * (s - s3)) ** 0.5
if __name__ == "__main__":
#1.输入三边
side1, side2, side3 = map(int, input("Enter three sides:").split(" "))
#2.判断是否符合三角形的性质
if is_valid(side1, side2, side3):
#3.1 符合 计算面积
result = area(side1, side2, side3)
print(result)
else:
#3.2 不符合 提示信息
print("三边不符合三角形的性质")
编写函数,打印一个元素由随机0或1产生的 n × n 矩阵。
def print_matrix(n):
import random
def print_matrix(n):
for i in range(n):
for j in range(n):
num = random.randint(0, 1) #[0, 1] 整数
print(num, end=" ")
print()
if __name__ == "__main__":
n = int(input("Enter n:"))
print_matrix(n)
"""
0 0 0
1 0 1
0 1 0
"""
有几种实现开平方 n \sqrt{n} n的技术,其中一个称为巴比伦法
它通过使用下面公式的反复计算近似地得到:
n e x t G u e s s = ( l a s t G u e s s + n / l a s e t G u e s s ) / 2 nextGuess=(lastGuess+n/lasetGuess)/2 nextGuess=(lastGuess+n/lasetGuess)/2
当nextGuess和lastGuess几乎相同时,nextGuess就是平方根的近似值
lastGuess初始值为1,如果nextGuess和lastGuess的差值小于一个很小的数,比如0.0001,就可以认为nextGuess是n的平方根的近似值;否则,nextGuess成为下一次计算的lastGuess,近似过程继续执行
编写代码,求解n的平方根的近似值
def sqrt(n):
def sqrt(n):
lastGuess = 1
nextGuess = 0
while True:
nextGuess = (lastGuess + n / lastGuess) / 2
dif = abs(lastGuess - nextGuess)
if dif < 0.0001:
return nextGuess
else:
lastGuess = nextGuess
print(sqrt(9))
print(sqrt(81))
print(sqrt(2))
掷两个色子,每个色子由六个面,分别表示1,2,3,4,5,6。
每次掷塞子检查两个色子的和:
(1)如果为2,3或12,你就输了;
(2)如果为7或11,你就赢了;
(3)如果是其他数字(4,5,6,8,9,10),标记为 point,接着继续掷色子;
(4)直到掷出一个7或者和point相同的点数。
(5)如果掷出为7,则你输了;如果掷出的点数和point相同,你就赢了。
import random
count = 0
def play_game_level_2(point):
while True:
num = random.randint(2, 12)
global count
count += 1
print(f"第{count}次掷色子:{num}")
if num == 7:
print("第二层逻辑下:输了")
return
elif num == point:
print("第二层逻辑下:赢了")
return
def play_game_level_1():
num = random.randint(2, 12)
global count
count += 1
print(f"第{count}次掷色子:{num}")
if num == 2 or num == 3 or num == 12:
print("第一层逻辑下:输了")
return
elif num == 7 or num == 11:
print("第一层逻辑下:赢了")
return
else:
play_game_level_2(num)
if __name__ == "__main__":
play_game_level_1()
以2000年1月1日周六为基准,打印一个年份的日历
请输入年份(2000年起步):2025
一月
————————————————————————————
一 二 三 四 五 六 日
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
二月
————————————————————————————
一 二 三 四 五 六 日
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28
三月
————————————————————————————
一 二 三 四 五 六 日
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31
......
# 基准年月日 全局变量
BEGIN_YEAR = 2000
BEGIN_MONTH = 1
BEGIN_WEEK = 6
# 将月份的数字转汉字
def get_month_str(month):
if month == 1:
return "一月"
elif month == 2:
return "二月"
elif month == 3:
return "三月"
elif month == 4:
return "四月"
elif month == 5:
return "五月"
elif month == 6:
return "六月"
elif month == 7:
return "七月"
elif month == 8:
return "八月"
elif month == 9:
return "九月"
elif month == 10:
return "十月"
elif month == 11:
return "十一月"
elif month == 12:
return "十二月"
# 打印month月的内容
def print_month_title(month):
print(" ", get_month_str(month))
print(" ---------------------------")
print(" 一 二 三 四 五 六 日")
print()
# 判断year是否为闰年
def is_leapyear(year):
return 400 % year == 0 or (year % 4 == 0 and year % 100 != 0)
# 获取year年month月的天数
def get_days_count(year, month):
if month in [1, 3, 5, 7, 8, 10, 12]:
return 31
elif month in [4, 6, 9, 11]:
return 30
elif is_leapyear(year):
return 29
else:
return 28
def get_days_begin(year, month):
# 核心:计算距离2000年1月1日 有多少天(整年 整月)
# 2002年3月 其实 2000年 + 2001年 + 1月 + 2月
# 先累计年的天数
total_days = 0
for i in range(BEGIN_YEAR, year):
if is_leapyear(i):
total_days += 366
else:
total_days += 365
# 再累计月的天数(当年的第1月)
for i in range(BEGIN_MONTH, month):
total_days += get_days_count(year, i)
return (total_days % 7 + BEGIN_WEEK) % 7
# 打印year年month月的具体内容
def print_month_body(year, month):
# 本月总共多少天
days_count = get_days_count(year, month)
# 本月的第一天是周几
days_begin = get_days_begin(year, month)
# 布局日期
cur_count = 0 # 记录打印的次数 每7次换行
# 打印前置空格
for i in range(days_begin):
print(" ", end="")
cur_count += 1
# 打印具体的日期
for i in range(1, days_count + 1):
print("%4d" % i, end="")
cur_count += 1
if cur_count % 7 == 0:
print()
print()
# 打印year年month月的内容
def print_month(year, month):
# 先打印标题
print_month_title(month)
# 再打印内容
print_month_body(year, month)
# 打印year年的日历 12个月
# 分别把每个月的日历都要打印出来
def print_calendar(year):
for month in range(1, 13):
# 打印month月的日历
print_month(year, month)
if __name__ == "__main__":
year = int(input("请输入年份(2000年起步):"))
# 打印year年的日历
print_calendar(year)