1.统计问题
问题描述
求解一组不定长数据的基本统计值,即平均值、标准差、中位数。
一组数据表示为S=s0, s1, …, sn-1,其算术平均值、标准差分别表示为:
由于平均数、标准差和中位数是三个不同的计算目标,使用函数方式编写计算程序。
- getNum()函数从用户输入获得数据;
- mean()函数计算平均值;
- dev()函数计算标准差;
- median()函数计算中位数
代码
# text36.py
from math import sqrt
def getNum(): # 获取用户输入
nums = []
iNumStr = input("请输入数字(直接输入回车退出): ")
while iNumStr != "":
nums.append(eval(iNumStr))
iNumStr = input("请输入数字(直接输入回车退出): ")
return nums
def mean(numbers): # 计算平均值
s = 0.0
for num in numbers:
s = s + num
return s / len(numbers)
def dev(numbers, mean): # 计算方差
sdev = 0.0
for num in numbers:
sdev = sdev + (num - mean)**2
return sqrt(sdev / (len(numbers)-1))
def median(numbers): # 计算中位数
sorted(numbers)
size = len(numbers)
if size % 2 == 0:
med = (numbers[size//2-1] + numbers[size//2])/2
else:
med = numbers[size//2]
return med
n = getNum() # 主体函数
m = mean(n)
print("平均值:{},方差:{:.2},中位数:{}.".format(m, dev(n, m), median(n)))
程序先后调用getNum()、mean()、dev()和median()函数。利用函数的模块化设计能够复用代码并增加代码的可读性。每个函数内部都采用了简单的语句。
列表在实现基本数据统计时发挥了重要作用,表现在:
- 列表是一个动态长度的数据结构,可以根据需求增减少元素;
- 列表的一系列方法或操作符为计算提供了简单的元素运算手段;
- 列表提供了对每个元素的简单访问方式及所有元素的遍历方式。
2.识别同构数
问题描述
- 程序功能:随机输入若干个不超过2位的正整数(输入-1表示输入结束),找出其中所有同构数并排序输出。(正整数n若是它平方数的尾部,则称n为同构数。如5的平方数是25,且5是25的尾部,那么5就是一个同构数。同理,25的平方为625,25也是同构数)。
- 输入输出要求如下: 输入时要求首先判断输入数位数(1-2位)是否正确,判断输入内容是否是数字,(提示:判断一个字符串是否是数字字符可用字符串的isdigit()方法)然后判断是否是同构数, 输出的同构数要求从小到大排序,结果显示在一行,各同构数间空格分隔。(提示:排序可用列表的sort()方法)
- 程序运行结果如下图所示:
代码
import math
def isTGS(n):
s = str(n*n)
if n == 1:
return True
elif len(s) > 3:
if s[-2:] == str(n):
return True
else:
return False
else:
if s[1:] == str(n):
return True
else:
return False
def getTGS():
L = []
s = input().strip()
while s != "-1":
if 0 < len(s) <= 2 and s.isdigit():
n = int(s)
if n > 0 and isTGS(n):
L.append(n)
s = input().strip()
return L
def main():
L = getTGS()
if len(L) == 0:
print("没有同构数")
else:
L.sort()
print("同构数有:", end="")
L = [str(i) for i in L]
print(' '.join(L), end=" ")
if __name__ == '__main__':
main()
3.四位玫瑰数
描述
四位玫瑰数是4位数的自幂数。自幂数是指一个 n 位数,它的每个位上的数字的 n 次幂之和等于它本身。
例如:当n为3时,有1^3 + 5^3 + 3^3 = 153,153即是n为3时的一个自幂数,3位数的自幂数被称为水仙花数。
请输出区间【a,b】之间所有4位数的四位玫瑰数,按照从小到大顺序,每个数字一行。a,b为4位数,且a小于等于b。
代码
import math
def isRose(n):#判断n是否是四位玫瑰数,是返回True,不是返回False
a=n//1000
b=n//100%10
c=n//10%10
d=n%10
if math.pow(a,4)+math.pow(b,4)+math.pow(c,4)+math.pow(d,4)==n:
return True
else:
return False
def checkNumber(n):#检查字符串n是不是构成4位数,是返回整数n,不是返回-1
if n[0]!=0 and len(n)==4:
return int(n)
else:
return -1
def printRose(a,b):#输出区间【a,b】之间所有的四位玫瑰数,不存在输出提示信息
n=0
for num in range(a,b+1):
if isRose(num)==True:
print(num)
n=n+1
if n==0:
print("此区间没有四位玫瑰数")
def main():
a=checkNumber(input())
if a==-1:
print("第一个数不是四位数")
return
b=checkNumber(input())
if b==-1:
print("第二个数不是四位数")
return
if a<=b:
printRose(a,b)
else:
printRose(b,a)
if __name__ == '__main__':
main()
4.进制转换
描述
输入十进制整数和欲转换的进制数r,将十进制转换为r进制数。(r>=2)
编程思想为:调用函数DToR,逐位求模。若该位为大于9的数,则以大写字母代表(提示:大写字母'A'的ASCII码值等于65);若该位为9以下的数,则转换为字符格式。从低位至高位连接字符串并返回结果。
运行示例如下:先输入一个十进制整数,再输入进制,输出结果。当输入q程序结束。
代码
def DToR(m, r):
t = ""
while m != 0 and r != 0:
c = m % r # 求模
if (c > 9):
t = chr(c-10+65)+t
else:
t = str(c)+t
m = m // r # 整除
return t
while True:
ipt = input()
if ipt == 'q':
break
r = int(input())
rst = DToR(int(ipt), r)
print("将%s转换为%d进制的结果为:%s" % (ipt, r, rst))
5.完数
描述
如果一个数除该数本身之外的所有因子之和等于这个数,该数是完数。例如:6=1+2+3,6是完数。
定义判断完数的函数isPerfect(),如果是返回True,不是返回False
输入一个数,调用该函数判断是否为完数,如果是输出“是完数”,如果不是输出“不是完数”
输入输出示例
输入 | 输出 | |
示例 | 6 7 | 6是完数 7不是完数 |
代码
# 函数功能:判断n是否为完数
# 如果是返回Ture,否则返回False
def isPerfect(n):
sum = 0
for i in range(1, n):
if n % i == 0:
sum += i
if sum == n:
return True
else:
return False
# 输入一个值,调用函数判断
n = eval(input())
if isPerfect(n) == True:
print("{}是完数".format(n))
else:
print("{}不是完数".format(n))
6.计算几何形状的表面积与体积
描述
输入一个表示几何形状名称的字符串,再在一行内输入这种图形的数据,根据表示名称的字符串选择合适的公式计算几何形状的(表)面积和体积,若为二维图形,只计算面积,若为三维图形,计算其表面积与体积,结果严格保留2位小数。
模板程序给出了长方形和长方体的代码,参考这些代码,完成圆形、球、圆柱体、圆锥和正三棱柱这5种形状的计算程序。
输入输出示例
示例 | 输入 | 输出 |
示例1 | 长方形 4 8 | 长方形的面积为32.00 |
示例2 | 长方体 4 8 9 | 长方体的表面积为280.00, 体积为288.00 |
示例3 | 圆形 88 | 圆形的面积为24328.49 |
示例4 | 球 88 | 球的表面积为97313.97, 体积为2854543.24 |
示例5 | 圆柱体 88 88 | 圆柱体的表面积为97313.97, 体积为2140907.43 |
示例6 | 圆锥 88 88 | 圆锥的表面积为58734.18, 体积为713635.81 |
示例7 | 正三棱柱 88 88 | 正三棱柱的表面积为29938.50, 体积为295086.03 |
代码
# 计算几何形状的表面积和体积
import math
def type_judge(geom_type):
"""接收一个字符串为参数,根据参数判断几何体类型
若输入为二维图形,计算其面积
若输入为三维图形,计算其面积与体积
根据类型调用不同的函数进行运算。
"""
if geom_type == '长方形':
length, width = map(float, input().split()) # 空格分隔的输入切分为列表并映射为浮点数
return square(length, width) # 调用函数计算长方形面积
elif geom_type == '长方体':
length, width, height = map(
float, input().split()) # 空格分隔的输入切分为列表并映射为浮点数
return cube(length, width, height) # 调用函数计算长方体表面积与体积
elif geom_type == '圆形':
radius = float(input()) # 输入转为浮点数
return circle(radius) # 调用函数计算圆面积
elif geom_type == '球':
radius = float(input()) # 输入转为浮点数
return sphere(radius) # 调用函数计算球表面积与体积
elif geom_type == '圆柱体':
radius, height = map(float, input().split()) # 空格分隔的输入切分为列表并映射为浮点数
return cylinder(radius, height) # 调用函数计算圆柱体表面积与体积
elif geom_type == '圆锥':
radius, height = map(float, input().split()) # 空格分隔的输入切分为列表并映射为浮点数
return cone(radius, height) # 调用函数计算圆锥表面积与体积
elif geom_type == '正三棱柱':
side, height = map(float, input().split()) # 空格分隔的输入切分为列表并映射为浮点数
return tri_prism(side, height) # 调用函数计算正三菱住表面积与体积
else:
return f'未找到{geom_type}计算方法'
def square(length, width):
"""计算长方形的面积"""
area_of_square = length * width
return f'长方形的面积为{area_of_square:.2f}'
def cube(length, width, height):
"""计算长方体的表面积和体积"""
area_of_cube = length * width * 2 + width * height * 2 + length * height * 2
volume_of_cube = length * width * height
return f'长方体的表面积为{area_of_cube:.2f}, 体积为{volume_of_cube:.2f}'
def circle(radius):
"""接收圆的半径,返回圆形的面积,圆周率用math.pi"""
area_of_circle = math.pi*math.pow(radius, 2)
return f'圆形的面积为{area_of_circle:.2f}'
def sphere(radius):
"""接收球的半径,返回球的表面积和体积,圆周率用math.pi"""
area_of_sphere = 4*math.pi*math.pow(radius, 2)
volume_of_sphere = math.pi*math.pow(radius, 3)*4/3
return f'球的表面积为{area_of_sphere:.2f}, 体积为{volume_of_sphere:.2f}'
def cylinder(radius, height):
"""接收圆柱体的底面半径和高,返回圆柱体的表面积和体积,圆周率用math.pi"""
area_of_cylinder = 2*math.pi*radius*(radius+height)
volume_of_cylinder = math.pi*radius*radius*height
return f'圆柱体的表面积为{area_of_cylinder:.2f}, 体积为{volume_of_cylinder:.2f}'
def cone(radius, height):
"""接收圆锥的底面半径和高,返回圆锥的表面积和体积,圆周率用math.pi"""
area_of_cone = math.pi*radius * \
(radius+math.sqrt(math.pow(radius, 2)+math.pow(height, 2)))
volume_of_cone = math.pi*math.pow(radius, 2)*height/3
return f'圆锥的表面积为{area_of_cone:.2f}, 体积为{volume_of_cone:.2f}'
def tri_prism(side, height):
"""接收正三棱柱的底边长和高,返回正三棱柱的表面积和体积"""
area_of_tri_prism = math.sqrt(3)*math.pow(side, 2)/2+3*side*height
volume_of_tri_prism = math.sqrt(3)*math.pow(side, 2)*height/4
return f'正三棱柱的表面积为{area_of_tri_prism:.2f}, 体积为{volume_of_tri_prism:.2f}'
if __name__ == '__main__':
type_of_geometry = input() # 接收用户输入的字符串
geometry = type_judge(type_of_geometry) # 调用判断图形类型的函数
print(geometry) # 输出函数运行结果