python3 基础题目练习

零 前言

  • 环境:win10、pycharm、python3.8、(jupyter notebook)
  • -2021年10月20首发
  • 千山踏飞雪,秋水共长天
  • 2021年10月26更新

6 题目:素数
6.1 题目:第k个素数
7 题目:回文数
8 题目:杨辉三角
9 题目:判断手机号是哪家运营商
10 题目:数字游戏
10.1 题目:猜数游戏(比大小)
10.2 题目:奇偶和游戏这里是引用

一 python3 基础题目

1 题目:斐波那契数列

斐波那契数列(Fibonacci sequence),又称黄金分割数列,指的是这样一个数列:0、1、1、2、3、5、8、13、21、34、……。
在数学上,费波那契数列是以递归的方法来定义
F0 = 0 (n=0)
F1 = 1 (n=1)
Fn = F[n-1]+ Fn-2

# 使用递归方法
# 递归两要素:1、递归终止条件;2、递归函数
def fibonacci(n):
	if n == 1 or n == 0:
		return n
	else:
		return fibonacci(n - 1) + fibonacci(n - 2)

print(fibonacci(5))
print(fibonacci(6))

1.2 题目:(斐波那契数列) 兔生兔

(斐波那契数列)有一对兔子,从出生后第3个月起每个月都生一对兔子,
小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问第16个月的兔子总数为多少?

def fibonacci(n):
	if n == 1 or n == 0:
		return n
	else:
		return fibonacci(n - 1) + fibonacci(n - 2)
m = 16
total_rabbit = 0
for i in range(1, m + 1):
	total_rabbit += fibonacci(m)
print("第%d月的兔子总数为%d"%(m, total_rabbit))

2 题目:输出 9*9 乘法口诀表

# 分行与列考虑,共9行9列,i控制行,j控制列。
for i in range(1, 10):
	for j in range(1, i + 1):
		print("%d*%d=%d" % (i, j, i*j), end=" " )
	print()

3 题目:格式化当前时间

import time
time_format = "%Y-%m-%d %H:%M:%S"
print (time.strftime(time_format,time.localtime(time.time())))

4 题目: 排列组合

有四个数字:1、2、3、4,能组成多少个互不相同且无重复数字的三位数?各是多少?

#range(1,5) = [1, 2, 3, 4]
# 暴力版
# 排列组合直观思路: 第一次 4取一; 第二次3取一,第三次2取1
for num in range(1,5):
	for num2 in range(1,5):
		if	num == num2:
			continue
		for num3 in range(1,5):
			if num3 == num2 or num3 == num:
				continue
			print(str(num) + str(num2) + str(num3))

扩展版(待补充)
如果是1到9 9个数字组成7位数呢?难道要写7层循环,显然不是很明智

total = 7
def joinNums(nums):
	strs = [str(item) for item in nums]
	return "".join(strs)
a = 1
b = 4
total = 3
for j in range(a, b + 1):

python工具包itertools

from itertools import permutations # 自带的排列工具包

def joinTupleNums(nums):
	'''
	将元组数据 格式化输出
	:param nums: (1, 2, 3)
	:type nums: 元组
	:return: 123
	:rtype: str
	'''
	strs = [str(item) for item in nums]
	return "".join(strs)
for item in permutations(range(1, 5), 3):
	print(joinTupleNums(item))

5 题目:某年某月某日,日期换算

5.1 输入某年某月某日,判断这一天是这一年的第几天?

# 2021年10月15日

months = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31] # 平年12月
weeks = ["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"]
weeks_zh = ["星期日","星期一","星期二","星期三","星期四","星期五","星期六"]

def isLeapYear(year):
	'''

	:param year: 判断year是否为闰年
	:type year: int
	:return: 是闰年返回true
	:rtype: bool
	'''
	if (year % 4 == 0 and year % 100 !=0) or year % 400 == 0:
		return True
	return False
# 第一组测试数据
# year = 2021
# month = 9
# day = 1
# 第二组测试数据
# year = 2021
# month = 10
# day = 15
year = int(input("请输入年份(如2021)"))
month = int(input("请输入月份(如:1)"))
day = int(input("请输入日期(如:1)"))
total = day
for i in range(0, month):
	total += months[i]
# total += sum(months[:month - 1])
if isLeapYear(year):
	total += 1

print("{}年{}月{}日是{}的第{}天".format(year,month,day,year, total))
# python >=3.8,可以使用以下的字符串格式方法
#print(f"{year}年{month}月{day}日是{year}的第{total}天")

5.2 题目:输入某年某月某日,判断这一天是星期几?

(公元1年1月1日是星期一, 基姆拉尔森计算公式)

# 第一组测试数据
# year = 2021
# month = 9
# day = 1
# 第二组测试数据
# year = 2021
# month = 10
# day = 15
year = int(input("请输入年份(如2021)"))
month = int(input("请输入月份(如:1)"))
day = int(input("请输入日期(如:1)"))
week=(day+2*month+int(3*(month+1)/5)+year+int(year/4)-int(year/100)+int(year/400)+1)%7
print("{}年{}月{}日是{}的第{}天".format(year,month,day,year, weeks_zh[week]))

6 题目:素数

# 判断素数
def is_prime(num):
	flag = True
	if num > 1:
		for i in range(2, math.floor(math.sqrt(num)) + 1):
			if (num % i) == 0:
				flag = False
				break
	return flag

6.1 题目:第k个素数

第k个素数问题的求解:,输入1 <= k <=3000; 输出第k个素数
# 判断素数
def is_prime(num):
	flag = True
	if num > 1:
		for i in range(2, math.floor(math.sqrt(num)) + 1):
			if (num % i) == 0:
				flag = False
				break
	return flag


# 键盘输入k
k = int(input("请输入k值:"))
num = 2
total = 0

while True:
	if is_prime(num):
		total += 1
	if total ==k:
		print(num)
		break
	num += 1

7 题目:回文数

回文数,从左向右和从右向左读都是一样的数,给定k,请找出从0开始的第k个回文数
#k	回文数
# 0	0
# 2 1
#20 101
def is_palindrome(num_s):
	flag = True
	length = len(num_s)
	if  length== 1:
		return flag

	for i in range(0, int(length/2)):
		if num_s[i] != num_s[length - i - 1]:
			flag = False
			break
	return flag

# 键盘输入k
k = int(input("请输入k值:"))
num = 0
total = 0

while True:
	if is_palindrome(str(num)):
		total += 1
	if total ==k:
		print(num)
		break
	num += 1

8 题目:杨辉三角

'''
        1
       1 1
      1 2 1
     1 3 3 1
    1 4 6 4 1
   1 5 10 10 5 1
  1 6 15 20 15 6 1
 1 7 21 35 35 21 7 1
1 8 28 56 70 56 28 8 1
'''
   # 给定一个非负整数numRows,生成杨辉三角的前numRows行
   # 在杨辉三角中,每个数是它左上方和右上方的数的和。
   # 示例:
   # 入:5
   # 输出:
#[  [1]
# [1, 1]
# [1, 2, 1]
#  [1, 3, 3, 1]
#  [1, 4, 6, 4.1] ]

在杨辉三角中,每个数是它左上方和右上方的数的和

  1. 方法一:
  • 已知第i行数列,则第i+1行数列为:

  • i+1 行数列第一个数为1

  • i 行数列的没两个数相加为i+1行的第2——i个数

  • i+1 行数列第i+1 个数为1

  1. 方法二:(在杨辉三角的两侧各补一个0,依据性质(每个数是它左上方和右上方的数的和),即i+1行的数都是由两个加数a+b相加得来的,i行的所有a组成一列,i行的所有b组成1列)
  • 已知第i行数列,则可以把第i行拆成两个数列

  • i行 最左边补一个0组成一个数列A

  • i行 最右边补一个0组成数列 B

  • 则第i+1行为 A + B 对位相加

# 在杨辉三角中,每个数是它左上方和右上方的数的和
# 方法一:
# 已知第i行数列,则第i+1行数列为:
# i+1 行数列第一个数为1
# i 行数列的没两个数相加为i+1行的第2——i个数
#i+1 行数列第i+1 个数为1
def triangles2():
    ret = [1]
    while True:
        yield ret
        for i in range(1, len(ret)):
            ret[i] = pre[i] + pre[i - 1]
        ret.append(1)
        pre = ret[:]
numRows = 5
total = 0
for item in triangles2():
	print(item)
	total += 1
	if total > numRows:
		break


# 方法二:(在杨辉三角的两侧各补一个0,依据性质(每个数是它左上方和右上方的数的和),即i+1行的数都是由两个加数a+b相加得来的,i行的所有a组成一列,i行的所有b组成1列)
# 已知第i行数列,则可以把第i行拆成两个数列
# i行 最左边补一个0组成一个数列A
#i行 最右边补一个0组成数列 B
#则第i+1行为 A + B 对位相加
def triangles(num):
    L = [1]
    for j in range(0, num):
        yield L
        L = [sum(i) for i in zip([0]+L, L+[0])]
numRows = 5
for item in triangles(numRows):
	print(item)

9 题目:判断手机号是哪家运营商

设计一个函数,当用户输入手机号码时,判断用户是哪家运营商用户(这里的数据来自百度,代码里面的数据来自“源题”)
中国移动号段:134(0-8)、135、136、137、138、139、147、150、151、152、157、158、159、172、178、182、183、184、187、188、195、197、198
中国联通号段:130、131、132、145、155、156、166、175、176、185、186、196
中国电信号段:133、149、153 、180 、181 、189、173、177、190、191、193、199
中国广电号段:192

'''
设计一个函数,当用户输入手机号码时,判断用户是哪家运营商用户
中国移动号段:134(0-8)、135、136、137、138、139、147、150、151、152、157、158、159、172、178、182、183、184、187、188、195、197、198
中国联通号段:130、131、132、145、155、156、166、175、176、185、186、196
中国电信号段:133、149、153 、180 、181 、189、173、177、190、191、193、199
中国广电号段:192
'''
zh_mobile = [134, 135, 136, 137, 138, 139, 147, 150, 151, 152, 157, 158, 159, 182, 183, 187, 188, 178]
zh_union = [130, 131, 132, 145, 155, 156, 185, 186, 176, 175]
zh_electric = [133, 153, 180, 181, 189, 177, 173, 149]



def destinct_agent(phone):
	num = int(phone[0:3])
	if num in zh_mobile:
		print("中国移动")
	elif num in zh_union:
		print("中国联通")
	elif num in zh_electric:
		print("中国电信")
	else:
		print("手机号码不符合格式")
phone_number = input("请输入手机号:")
destinct_agent(phone_number)

10 题目:数字游戏

10.1 题目:猜数游戏(比大小)

猜数游戏: 系统预设一个0~9之间的整数,让用户通过键盘输入所猜的数;
如果大于预设的数,显示“遗憾,太大了”
如果小于预设的数,显示“遗憾,太小了”
如此循环,直到猜中该数,显示“你猜了N次,终于猜中了!”
其中N为用户输入数字的次数

'''
猜数游戏: 系统预设一个0~9之间的整数,让用户通过键盘输入所猜的数;
如果大于预设的数,显示“遗憾,太大了”
如果小于预设的数,显示“遗憾,太小了”
如此循环,直到猜中该数,显示“你猜了N次,终于猜中了!”
其中N为用户输入数字的次数
'''

# from random import random
import random

def guess_game():
	pre_num = random.randint(0, 9)
	# print(pre_num)
	total = 0
	while True:
		num = int(input("请输入你猜的数值:"))
		total += 1
		if pre_num == num:
			print("你猜了{}次,终于猜中了!".format(total))
			break
		elif pre_num < num:
			print("遗憾,太大了")
		else:
			print("遗憾,太小了")

guess_game()

10.2 题目:奇偶和游戏

奇偶和游戏:
用户和电脑分别给出一个1——100000之间(含端点)的正整数,和为偶数,
输出“玩家胜”,和为奇数,输出“电脑胜”
当用户输入q或者Q时,退出游戏,并分别输出电脑、玩家的获胜次数

'''
奇偶和游戏:
用户和电脑分别给出一个1——100000之间(含端点)的正整数,和为偶数,
输出“玩家胜”,和为奇数,输出“电脑胜”
当用户输入q或者Q时,退出游戏,并分别输出电脑、玩家的获胜次数
'''

import random
player_win = 0
computer_win = 0
while True:
    print("==========开始游戏=============")
    computer_num = random.randint(1, 100000)
    player_num_str = input("输入你的幸运数字(输入q 或者 Q退出游戏):")
    if player_num_str.strip().lower() == "q":
        break
    player_num = int(player_num_str.strip())
    if (computer_num + player_num) % 2 == 0:
        player_win += 1
        print("玩家胜")
    elif (computer_num + player_num) % 2 != 0:
        computer_win += 1
        print("电脑胜")
	print("===============================")
print("==========游戏结束=============")
print(f"电脑获胜{computer_win}次,玩家获胜{player_win}次")

jupyter 版本

gitee

image-20211020171434833

image-20211020171511139

image-20211020171540969

image-20211020171604265

image-20211020171623734

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

PythonJavaC++go

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值