22秋季Python第8周作业(函数)
函数题
6-1 jmu-python-函数-圆形生成器
函数接口定义:
getCircleArea(r) #r代表整数半径 get_rList(n) #n代表在函数中输入n个值放入列表。
裁判测试程序样例:
/* 请在这里填写答案 */ n = int(input()) rList = get_rList(n) for e in rList: print('{:10.3f}'.format(getCircleArea(e))) print(type(rList))``
输入样例:
3 1 2 3
输出样例:
3.142 12.566 28.274 <class 'list'>
代码:
import math # 功能:可对指定r计算圆面积。 def getCircleArea(r): return math.pi * r * r # 功能:输入n个值放入列表并将列表return。 def get_rList(n): list1 = [] for i in range(n): x = eval(input()) list1.append(x) return list1
6-2 jmu-python-判断质数
函数接口定义:
def isPrime(num)
裁判测试程序样例:
/* 请在这里填写答案 */ num=input() if isPrime(num): print('yes') else: print('no')
输入样例1:
ab
输出样例1:
no
输入样例2:
1.1
输出样例2:
no
输入样例3:
11
输出样例3:
yes
代码:
def isPrime(num): try: num = int(num) except: return False if num <= 1: return False else: for i in range(2, int(pow(num, 0.5)) + 1): if num % i == 0: return False break return True
6-3 jmu-python-函数-找钱
函数接口定义:
giveChange(money) #money为要找的钱。经过计算,应按格式"要找的钱 = x*10 + y*5 + z*1"输出。
裁判测试程序样例:
/* 请在这里填写答案 */ n = int(input()) for i in range(n): giveChange(int(input()))
输入样例:
5 109 17 10 3 0
输出样例:
109 = 10*10 + 1*5 + 4*1 17 = 1*10 + 1*5 + 2*1 10 = 1*10 + 0*5 + 0*1 3 = 0*10 + 0*5 + 3*1 0 = 0*10 + 0*5 + 0*1
代码:
def giveChange(money): # money为要找的钱。经过计算,应按格式"要找的钱 = x*10 + y*5 + z*1"输出。 x = money // 10 y = (money - (x * 10)) // 5 z = money - (x * 10) - (y * 5) print('{} = {}*10 + {}*5 + {}*1'.format(money, x, y, z))
6-4 使用函数求素数和
函数接口定义:
prime(p),返回True表示p是素数,返回False表示p不是素数 PrimeSum(m,n),函数返回素数和
裁判测试程序样例:
/* 请在这里填写答案 */ m,n=input().split() m=int(m) n=int(n) print(PrimeSum(m,n))
输入样例:
1 10
输出样例:
17
代码:
def Prime(num): try: num = int(num) except: return False if num <= 1: return False else: for i in range(2, int(pow(num, 0.5)) + 1): if num % i == 0: return False break return True def PrimeSum(m,n): sum = 0 for num in range(m,n+1): if Prime(num): sum += num; return sum
6-5 使用函数统计指定数字的个数
函数接口定义:
在这里描述函数接口。例如: CountDigit(number,digit ),返回digit出现的次数
裁判测试程序样例:
/* 请在这里填写答案 */ number,digit=input().split() number=int(number) digit=int(digit) count=CountDigit(number,digit ) print("Number of digit 2 in "+str(number)+":",count)
输入样例:
在这里给出一组输入。例如:
-21252 2
输出样例:
在这里给出相应的输出。例如:
Number of digit 2 in -21252: 3
代码:
def CountDigit(number, digit): ans = 0 if number < 0: number = abs(number) x = 0 while number > 0: x = number % 10 if digit == x: ans += 1 number = number // 10 return ans
6-6 使用函数输出指定范围内Fibonacci数的个数
函数接口定义:
在这里描述函数接口。例如: fib(n),返回fib(n)的值 PrintFN(m,n),用列表返回[m, n]中的所有Fibonacci数。
裁判测试程序样例:
在这里给出函数被调用进行测试的例子。例如: /* 请在这里填写答案 */ m,n,i=input().split() n=int(n) m=int(m) i=int(i) b=fib(i) print("fib({0}) = {1}".format(i,b)) fiblist=PrintFN(m,n) print(len(fiblist))
输入样例:
在这里给出一组输入。例如:
20 100 6
输出样例:
在这里给出相应的输出。例如:
fib(6) = 13 4
代码:
def fib(n): # 返回fib(n)的值 if n == 0 or n == 1: return 1 else: return fib(n - 1) + fib(n - 2) def PrintFN(m, n): # 用列表返回[m, n]中的所有Fibonacci数。 list1 = [] for num in range(25): if m <= fib(num) <= n: list1.append(fib(num)) return list1
6-7 缩写词
函数接口定义:
acronym(phrase); phrase是短语参数,返回短语的缩写词
裁判测试程序样例:
/* 请在这里填写答案 */ phrase=input() print(acronym(phrase))
输入样例:
central processing unit
输出样例:
CPU
代码:
def acronym(phrase): data = phrase.split() # print(data) # ['central', 'processing', 'unit'] ans = '' for i in range(len(data)): ans += data[i][0].upper() # upper 小写变大写 return ans
6-8 jmu-python-发牌
裁判测试程序样例:
import random /* 请在这里填写答案 */ suit=['♥','♠','♦','♣'] d=['A','2','3','4','5','6','7','8','9','10','J','Q','K'] n=int(input()) random.seed(n) poker=create() poker=shufflecard(poker) for i in range(52): print('%-4s'%poker[i],end=' ') if i%13==12: print() for i in range(1,5): deal(poker,i)
输入样例:
7
输出样例:
♠5 ♣A ♦6 ♥J ♣2 ♥Q ♥A ♠7 ♠2 ♣Q ♠4 ♥9 ♦K ♣6 ♦8 ♣7 ♠Q ♦4 ♠10 ♥K ♠9 ♣5 ♦5 ♦3 ♣J ♣K ♥8 ♣10 ♠6 ♦10 ♥2 ♦J ♣4 ♠3 ♣8 ♦A ♦2 ♥6 ♥3 ♠A ♦7 ♣9 ♦Q ♠J ♥7 ♦9 ♥5 ♥4 ♣3 ♠K ♥10 ♠8 第1个玩家拿到的牌是:♠5,♣2,♠2,♦K,♠Q 第2个玩家拿到的牌是:♣A,♥Q,♣Q,♣6,♦4 第3个玩家拿到的牌是:♦6,♥A,♠4,♦8,♠10 第4个玩家拿到的牌是:♥J,♠7,♥9,♣7,♥K
代码:
def create(): global suit global d list1 = [] for su in suit: for itd in d: list1.append(str(su + itd)) return list1 def shufflecard(poker): random.shuffle(poker) return poker def deal(poker, i): print("第{}个玩家拿到的牌是:".format(i), end='') temp = i for it in range(1, 6): if it <= 4: print('%s' % poker[temp - 1], end=',') else: print('%s' % poker[temp - 1], end='\n') temp += 4
编程题
7-1 哥德巴赫猜想
输入样例:
24
输出样例:
24 = 5 + 19
代码:
def isPrime(num): try: num = int(num) except: return False if num <= 1: return False else: for i in range(2, int(pow(num, 0.5)) + 1): if num % i == 0: return False break return True n = int(input()) for i in range(2, n): if isPrime(i) and isPrime(n - i): break print("{} = {} + {}".format(n, i, n - i))
7-2 数字金字塔
代码:
print(""" 1 2 2 3 3 3 4 4 4 4 5 5 5 5 5 """)
7-3 jmu-python-凯撒密码加密算法
输入样例:
在这里给出一组输入。例如:
Hello World! 3
输出样例:
在这里给出相应的输出。例如:
Khoor Zruog!
代码:
text = input() k = int(input()) ans = '' for i in text: if i.isalpha(): x = ord(i)+k if chr(x).isalpha(): ans += chr(x) else: ans += chr(x-26) else: ans += i print(ans)
7-4 最小公倍数
输入样例:
1 3 15 20
输出样例:
3 60
代码:
import math while True: try: a, b = map(int, input().split()) # print("{:} {:}".format(math.gcd(a, b), int(a * b / math.gcd(a, b)))) print("{:}".format(int(a * b / math.gcd(a, b)))) except: break
7-5 特立独行的幸福
输入样例 1:
10 40
输出样例 1:
19 8 23 6 28 3 31 4 32 3
注意:样例中,10、13 也都是幸福数,但它们分别依附于其他数字(如 23、31
等等),所以不输出。其它数字虽然其实也依附于其它幸福数,但因为那些数字不在给定区间 [10, 40]
内,所以它们在给定区间内是特立独行的幸福数。
输入样例 2:
110 120
输出样例 2:
SAD
代码:
l,r=input().split() l,r=int(l),int(r) list,ans,child=[],[],{} #list存所有的幸福树;ans存独立的幸福树,即不依赖于区间内的其他数字;child存区间内依赖该幸福数(key)的幸福数的个数(value) for num in range(l,r+1):#枚举区间所有数字 sum = 0 tnum = num vis={} while sum!=1 or vis[sum]<2: sum = 0 for digit in str(tnum):#对一个十进制的各位数字做一次平方和 sum += int(digit)**2 vis.setdefault(sum,0)#字典初始化 vis[sum]+=1 #一次迭代结束 该数字在迭代过程中出现次数+1 if(vis[sum]==2):#该数字在迭代过程中出现次数==2 即首次出现死循环 当前枚举的数字num是不幸福数 break tnum = sum if(sum==1):#数字num是幸福数 若干次迭代结束时平方和sum==1 ans.append(num)#存进幸福数数组 tnum = num sum = 0 child.setdefault(num,0) #计算这个幸福数的独立性 即数依赖于这个数num的幸福数的个数 while(sum!=1): sum = 0 for digit in str(tnum): sum += int(digit) ** 2 list.append(sum) #对幸福数迭代 迭代过程中出现的数都是幸福数 全部加进list中 但对num进行迭代 幸福数num本身没有进入list,即如果一个幸福数是独立的,在有限区间[l,r]内不依附于其他数字,则不会出现在list中 tnum = sum child[num]+=1 #依赖于幸福数num的幸福数的个数+1 #一个幸福数num的child值为num迭代到1的过程中产生的全部sum值的个数 因为迭代到1就结束循环 过程显然是没有产生重复sum值的 import math def isPrime(n): if n <= 1: return False for i in range(2, int(math.sqrt(n)) + 1): if n % i == 0: return False return True for item in ans: if item not in list:#出现在list中的幸福数都是其他幸福数迭代过程中产生的 if isPrime(item): child[item]*=2 print(item,child[item]) if(len(ans)==0): print("SAD")
7-6 用函数求两个整数的最大公约数和最小公倍数
输入样例:
24 36 -48 128
输出样例:
12 72 16 -384
提示(公约数、公倍数)
提示:a,b里有负的则最小公倍数就为负的
注意要判断正负
代码:
方法1
import math import sys # while True: # line = sys.stdin.readline() # 一次只读一行 for line in sys.stdin: line = line.strip() x = line.split() if line == '\n': break a = int(x[0]) b = int(x[1]) # print("{:} {:}".format(math.gcd(a, b), int(a * b / math.gcd(a, b)))) if a < 0 or b < 0: a = abs(a) b = abs(b) print("{} {}".format(math.gcd(a, b), -int(a * b / math.gcd(a, b)))) else: print("{} {}".format(math.gcd(a, b), int(a * b / math.gcd(a, b))))
方法2
import sys def gys(a, b): for i in range(min(a, b), 0, -1): if a % i == 0 and b % i == 0: return i def gbs(a, b): for i in range(min(a, b), 0, -1): if a % i == 0 and b % i == 0: return a * b // i for i in sys.stdin: a, b = list(map(int, i.split())) if a < 0 or b < 0: a = abs(a) b = abs(b) print("{} {}".format(gys(a, b), -gbs(a, b))) else: print("{} {}".format(gys(a, b), gbs(a, b)))