Python题库:函数
目录
- 1 累加函数
- 1.1 描述
- 1.2 输入格式
- 1.3 输出格式
- 2 自定义幂函数(2022重点看)
- 3 汽车迷
- 3.1 描述
- 3.2 输入格式
- 3.3 输出格式
- 3.4 示例
- 4 猴子吃桃
- 5 奇偶求和
- 6 字符串移位
- 7 字母查找2.0(函数)
- 8 编写函数输出自除数
- 9 二分法求平方根B
- 10 素数求和
- 11 回文素数(2022重点看)
- 12 反素数
- 13 侯先生爬楼梯
- 14 哥德巴赫猜想
- 14.1 描述
- 14.2 输入格式
- 14.3 输出格式
- 15 计算ID号
- 16 奇偶求和(2022重点看)
- 17 分解质因数
- 17.1 描述
- 17.2 输入格式
- 17.3 输出格式
- 17.4 示例
- 18 汉诺塔
- 19 贪心的交易
累加函数
描述
编写一个函数实现从 1 到 N 共 N 个数的累加
输入格式
一个正整数N
输出格式
计算结果
示例 1
输入:100 输出:5050 平均代码量 5 行
自定义幂函数(2022重点看)
描述
定义一个函数实现整数的幂运算,用以计算 x 的 n 次方。
输入格式
在一行内输入两个非负整数 x 和 n,数字间用空格分隔。
输出格式
x 的 n 次幂的运算结果
输入输出示例
输入 输出
示例 1 2 3 8
汽车迷
类型:函数
描述
小明是一个汽车迷,看到什么汽车马上就可以说出汽车的生产年份、型号和品牌。定义一个函数,可以输出汽车的介绍。
例如输入:
2020 AMG_S65 奔驰
可以输出:
这是一辆2020年生产,型号是AMG_S65的奔驰牌汽车
要求函数具有以下功能:当用户只输入生产年份、型号时,品牌按“宝马”输出。
输入格式
输入用空格分隔的年、型号和品牌(品牌可能没有)
输出格式
这是一辆年生产,型号是的牌汽车( 根据用户输入进行替换)
示例
输入:2020 AMG_S65 奔驰
输出:这是一辆2020年生产,型号是AMG_S65的奔驰牌汽车。
猴子吃桃
类型:函数
描述
猴子第1天摘了一堆桃子吃了一半又多一个,第2天吃了剩下的一半又多一个,...,第10天早上时发现只有1个桃子了。问第1天摘了多少?
示例
输出:xxxx
奇偶求和
类型:函数
描述
输入一个完全由数字字符组成的字符串s,分别统计其中出现的奇数和偶数字符数值之和
如输入‘123456789’
输出 oddsum=25,evensum=20
字符串移位
类型:函数
描述
在两行中分别输入一个字符串s和整数n,定义一个函数将字符串s循环向右移动n位,n为负数时左移。
若s为空字符串,则不论n为多少,均输出空字符串。
如 s='123456' n=3
输出结果:456123
代码框架如下:
def f(s,n): ...... s=input() n=int(input()) print(f(s,n))
示例
输入: 123456 2 输出: 561234
字母查找2.0(函数)
类型:函数
描述
定义一个函数来判断单词m是否可以由字符串n中出现的字母来组成。
本题保证字符串中出现的字母均为小写字母,n中的字母只能使用一次。
在两行中分别输入两个字符串m,n
如果m,n 满足条件,则输出’FOUND‘ ,否则输出'NOT FOUND'
如果输入的m包含有除字母外的其他字符,输出’ERROR‘结束
示例
示例 1 输入: word world 输出: FOUND 示例 2 输入: 1a3e 输出: ERROR 示例 3 输入: at bcda 输出: NOT FOUND 示例 4 输入: hello heol 输出: NOT FOUND
编写函数输出自除数
类型:函数
描述
一个不含0的数,如果它能被它的每一位除尽,则它是一个自除数。例如128是一个自除数,因为128能被1、2、8整除。编写函数selfDivisor(num)判断num是否为自除数,使用该函数输出不大于N的所有自除数。
(注意,含有数字0的数不是自除数)
===输入格式===
输入为一行,一个正整数N(N>=1)。
输出格式
输出为一行,是不大于N的所有自除数,每个数后面有一个空格。
示例 1
输入:1 输出:1 示例 2 输入:22 输出:1 2 3 4 5 6 7 8 9 11 12 15 22
二分法求平方根B
描述
设计一个用二分法计算一个大于或等于 0 的实数 n 的平方根的函数sqrt_binary(n),实数 n和计算精度控制由用户在同一行内输入,用逗号进行分隔,输出结果保留8位小数。当(abs(x * x - n) )小于或等于设定的精度时,近似认为 x * x == n。
注:初始区间取[0,n+0.25]
输入格式
在同 行内输入一个实数 n(大于或等于0)和一个代表精度的数字(可用1e-m格式输入),逗号间隔
输出格式
第一行输出用自己设计的函数计算得到的平方根
第二行输出用math库开平方函数计算得到的平方根
输入输出示例
输入 输出
示例 1 5.0,1e-7
代码
import math def sqrt_binary(num, accuracy): """接收一个浮点数num和一个表示计算精度的浮点数accuracy为参数,用二分法计算浮点数的平方根x, 当 abs(x * x - num) <= accuracy时认为达到计算精度,以浮点数类型返回计算得到的平方根。""" low, high = 0, num + 0.25 # 设定初始区间 while True: # 构建无限循环 x = (high + low) / 2 # 假设平方根落在区间的二分之一处,即中点 if abs(x * x - num) <= accuracy: # 当误差小于计算精度时,终止循环 return x # 返回当前的x值为平方根 elif x * x - num < 0: # 当前x的平方小于num时,平方根应该位于右侧区间 low = x # 以当前数值为区间下限,缩小区间为原来的一半 else: # 当前x的平方大于num时,平方根应该位于左侧区间 high = x # 以当前数值为区间上限,缩小区间为原来的一半 n, error = map(float, input().split(',')) # 输入浮点数 n 和计算精度 print('{:.8f}'.format(sqrt_binary(n, error))) # 调用二分法函数计算平方根 print('{:.8f}'.format(math.sqrt(n))) # 用math库中的sqrt()计算平方根
代码2
import math def sqrt_binary(num,accuracy): p1,p2 = accuracy.split("e-") length = int(p2)+1 s =math.sqrt(num) s =round(s,length) return s n = float(input("请输入一个实数")) p = input("请输入精度数字") #print(p) result = sqrt_binary(n,p) print(result)
素数求和
类型:函数
描述
输入一个正整数n,统计从[0,n]之间的最大的10个素数之和。本题保证测试用例至少有10个满足条件的素数。
例如:输入31 ,应求得3,5,7,11,13,17,19,23,29,31之和。
本题要求使用自定义函数完成,代码框架参考如下:
def isprime(n): #判断素数函数 ...... def f(n): #找小于n的素数并求和 ...... ...... p=int(input()) print(f(p))
示例 1
输入:31 输出:158
回文素数(2022重点看)
描述
回文素数是指一个数既是素数又是回文数。例如,131,既是素数又是回文数。
用户输入一个正整数 n , 请你在一行内输出从小到大排列的的前n个回文素数,数字后面用一个空格进行分隔。
输入格式
输入一个正整数
输出格式
符合要求的回文素数
输入输出示例
def is_prime(n): """判断素数的函数,接收一个正整数为参数,参数是素数时返回True,否则返回False 减小判定区间,减少循环次数,提升效率。 """ if n < 2: return False # 0、1、负数以及偶数都不是素数 for i in range(2, int(n ** 0.5) + 1): if n % i == 0: # 能被2到其根号n之间的整数整除的数不是素数 return False else: return True # for循环正常结束,未遇到return的数是素数 def palindromic(num): """接收一个数字为参数,判定其是否为回文数,返回布尔值。""" if str(num) == str(num)[::-1]: return True else: return False def output_prime(num): """接收一个正整数num为参数,在一行中从小到大输出前num个回文素数。 函数无返回值 """ i = 2 # 从最小的素数2开始测试 count = 0 # 计数器置0 while True: # 无限循环 if palindromic(i) and is_prime(i): # 先判断回文再判断素数,效率高 print(i, end=' ') # i为回文素数时输出i,输出后不换行 count = count + 1 # 每发现一个回文素数计数增加1 if count == num: # 如果找到回文素数数量与要求数量相同时 break # 结束循环 i = i + 1 # 测试下一个数字 if __name__ == "__main__": n = int(input()) output_prime(n)
反素数
描述
反素数(逆向拼写的素数)是指一个将其逆向拼写后也是一个素数的非回文数。例如:13和31都是素数,且13和31都不是回文数,所以,13和31是反素数。 输入一个正整数 n , 请输出从小到大排列的的前n个反素数,数字后面以一个空格进行分隔。
输入格式
输入一个正整数
输出格式
符合条件的反素数
输入输出示例
代码
def prime(n): if n <= 1: #小于2的数字单独处理 return 0 for i in range(2,int(n**(1/2)+1)): #根据素数定义判定是否是素数,是素数返回1 if n % i == 0: return 0 return 1 if __name__ == "__main__": n = int(input()) i = 2 count = 0 while True: if prime(i) and prime(int(str(i)[::-1])) and str(i) != str(i)[::-1]: #如果是反素数 print(i,end = ' ') #数字间空格分隔 count = count + 1 if count == n: break i = i+ 1
侯先生爬楼梯
描述
侯先生每天都会爬楼梯锻炼身体,他有时候一次上跨一级,有时候一次上跨两级...有一天侯先生想弄明白一个很难的问题:从最下面的第1级开始到顶端的第n级一共有多少种走法呢?比如n是3时,有两种走法(或者直接从第1级上跨两步到第3级,或者从第1级跨一步到2级再跨一步到第3级)。
请你帮帮侯先生,给你n(1<n<40)的值,你帮忙计算并输出有多少种爬到顶端的方法。
输入格式
输入n的值,n是1到40之间的整数。
输出格式
输出一共有多少种从第1级台阶到第n级台阶的走法。
代码
参考代码: n=eval(input()) li=[0]*n if n==2: print(1) elif n==3: print(2) else: li[n-1]=1 li[n-2]=2 for i in range(n-3,0,-1): li[i]=li[i+1]+li[i+2] print(li[1]) #或者使用递归来实现: def upstrs(n): if n==2: return 1 elif n==3: return 2 else: return upstrs(n-1)+upstrs(n-2) n=eval(input()) li=[0]*n print(upstrs(n))
哥德巴赫猜想
类型:函数
描述
数学领域著名的“哥德巴赫猜想”的大致意思是:任何一个大于2的偶数总能表示为两个素数之和。例如:24=5+19,其中5和19都是素数。本实验的任务是设计一个程序,验证20亿以内的偶数都可以分解成两个素数之和。输入一个大于2的正整数,当输入为偶数时,在一行中按照格式“N = p + q”输出N的素数分解,其中p 、 q均为素数且p ≤ q。因为这样的分解可能不唯一(例如24还可以分解为7+17),要求必须输出所有解中p最小的解。当输入为奇数时,输出'Data error!' 。
输入格式
输入一个大于2的正整数
输出格式
当输入为偶数时,按照格式“N = p + q”输出N的素数分解;当输入为奇数时,输出'Data error!' 。
===示例===
输入:36 输出:36 = 5 + 31 平均代码量 18 行
计算ID号
描述
我的微信ID是大写字母WHUT后面的数字是两个素数连在一起,大的在前,小的在后,如果我告诉你两数的乘积是多少,你能计算出我的ID号吗?
如果输入一个[0-9]之间的数字,你能统计出从1开始到我ID中的数字的序列里,一共出现多少次这个数字吗?
输入格式
第一行输入ID中两个素数的乘积
第二行输入一个[0-9]之间的数字
输出格式
第一行输出ID号
第二行输出数字的次数
输入输出示例
输入 输出 示例 1 196409 3 WHUT997197 599140
代码
def isPrime(n): # 判断参数 n 是否为素数的函数 if n < 2: # 小于2的数字都不是素数 return False for i in range(2, int(n ** 0.5) + 1): # 根据素数定义判定是否是素数,是素数返回1 if n % i == 0: # 从 2到n-1中如果存在一个数是i,使n 可以整除i,则n不是素数 return False else: # 若for循环未遇到return正常结束,则n是素数 return True def checkId(n): if n % 2 == 0 and isPrime(n // 2): # 如果n能被2整除,单独处理,提高效率 return int(str(n // 2) + str(2)) else: for num in range(3,n//2+1,2): # 如果n不能被2整除,则两个素数不包括2,都是奇数 if isPrime(num) and n % num == 0 and isPrime(n // num): # isPrime(n // num)放在最后,利用短路效应,可以使大数的素数判定次数最少 return int(str(n // num) + str(num)) # 返回值转字符串拼接后再转整数 def countnumber(n,num): m, countnum = 1, 0 while n//m > 0: high, mod = divmod(n, m*10) curNum, low = divmod(mod, m) if curNum > num: countnum += high*m + m elif curNum == num: countnum += high*m + low + 1 else: countnum+= high*m m = m*10 return countnum if __name__ == '__main__': n = int(input()) # 输入ID,整数,保证是两个素数的积 number = int(input()) # 输入0-9之间的一个数字 ID = checkId(n) countNumber = countnumber(ID,number) # 统计 number的个数 print('WHUT' + str(ID)) print(countNumber)
奇偶求和(2022重点看)
描述
输入一个完全由数字字符组成的字符串s,分别统计其中出现的奇数和偶数字符数值之和
如输入‘123456789’
输出 oddsum=25,evensum=20
本题需要使用自定义函数完成,建议代码框架如下:
def f(n): ...... def p(t): ...... def ....... s=input() print('oddsum={},evensum={}'.format(......))
输入输出示例
输入 输出 示例 1 123456789 oddsum=25,evensum=20
分解质因数
类型:函数
描述
输入一个正整数n,把数字n分解成不能再分解因子的乘法,比如:8=222, 10 = 2*5,而不是 8 = 2 * 4 这种可以再分解的。
输入格式
输入一个正整数n
输出格式
输出包含所有因子的列表
示例
输入:12
输出:[2, 2, 3]
汉诺塔
描述
汉诺塔:汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。
柱子编号为a, b, c,将所有圆盘从a移到c可以描述为:
如果a只有一个圆盘,可以直接移动到c; 如果a有N个圆盘,可以看成a有1个圆盘(底盘) + (N-1)个圆盘,首先需要把 (N-1) 个圆盘移动到 b,然后,将 a的最后一个圆盘移动到c,再将b的(N-1)个圆盘移动到c。 请编写一个函数move(n, a, b, c) ,给定输入 n, a, b, c,打印出移动的步骤: 例如,输入 move(2, ‘A’, ‘B’, ‘C’),打印出: A –> B A –> C B –> C
输入格式
有两行:
第一行一个正整数
第二行有三个符号,如A、B、C或a,b,c等,输入时用空格分隔开。 输出格式
移动过程的记录
输入输出示例
输入 输出 示例 1 2 A B C A --> B A --> C B --> C
贪心的交易
描述
商品价格每天都在变化,作为一个商人,需要低买高卖赚取利润,通常会根据历史数据,检验策略的收益。
已知有一个商品历史价格变化列表。其中第 i 个元素是第 i 天该商品的价格。
现在使用的贪心策略是在该过程中要求必须尽可能多的进行获利的交易,并且每次买入时都要先清仓(全部卖出上一次买入的商品),不能同时进行多笔交易。
定义一个函数,计算你在这种策略下能获取的最大利润。
比如价格列表为 [1,3,5,1,8],利润最大为11元,
第1天买入,第2天卖出 获利3-1=2元
第2天买入,第3天卖出 获利5-3=2元
第4天价格跌落,所以第三天无交易
第4天买入,第5天卖出 获利8-1=7元
总利润为 2+2+7=11元
本题的编程模板会帮助你建立一个随机的价格列表(价格在1-100元的闭区间中),你需要在两行中各输入一个整数,第一行输入一个可交易的总天数(即列表中的价格个数),第二行输入一个整数做为随机种子。
输出时模板会在两行中分别输出生成的价格列表以及能获取的最大利润。
提示:列表的索引使用方式与字符串相同。
输入
在两行输入中各输入一个整数
输出
生成的价格列表
获取的最大利润
输入输出示例
输入 输出 示例 1 10 6 [74, 11, 63, 98, 34, 5, 1, 19, 85, 76] 171