【python】习题 第8周
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)))