项目实训8
判断素数
描述
依次判定10以内的数是否是素数,是素数时输出该数是素数,否则输出其因式分解
输入格式
无
输出格式
示例:
3是素数
4 = 2 * 2,不是素数
运行代码:
for num in range(2, 11): for i in range(2, num): if num % i == 0: print(f'{num}={num}*{num // i},{num}不是素数!', end='') break else: print(f'{num}是素数!', end='')
运行结果:
项目实训9:
百钱买百鸡
描述
我国古代数学家张丘建在《算经》一书中提出的数学问题:鸡翁一值钱五,鸡母一值钱三,鸡雏三值钱一。百钱买百鸡,如果要求鸡翁、鸡母、鸡雏都不为零,问鸡翁、鸡母、鸡雏各几何。
现在的问题是:用户输入鸡的数量和钱数,鸡翁、鸡母、鸡雏各为多少?如果有解,输出全部解,并按鸡翁数量由少到多的顺序输出;如果无解则输出“无解”。
输入格式
用户在同一行内输入用空格分隔的两个正整数,分别表示鸡的数量和钱数
输出格式
每行输出一组结果,按鸡翁数、鸡母数、鸡雏数的顺序输出;
有多组解时,按鸡翁数量由少到多输出;
如果无解则输出“无解”。
运行代码:
num, m = map(int, input().split()) flag = 0 for cock in range(1, num): for hen in range(1, num): for chicken in range(3, num, 3): if cock + hen + chicken == num and 5 * cock + 3 * hen + chicken // 3 == m: print(cock, hen, chicken) flag = 1 break if flag == 1: break if flag == 1: break if flag == 0: print('无解')
项目实训10:
最小公倍数
描述
输入一个正整数n,判断在1和这个整数之间是否存在一个数是3和5的最小公倍数,如果存在最小公倍数,输出这个数,否则输出“n以内没有3和5的公倍数”
输入格式
输入一个正整数n
输出格式
输出最小公倍数数,或输出“n以内没有3和5的公倍数
运行代码:
num = int(input('输入一个正整数:')) for i in range(1, num): if i % 3 == 0 and i % 5 == 0: print(i) break else: print(f'{num}以内没有3和5的公倍数!')
运行结果:
项目实训11:
最大素数
描述
用户输入一个正整数 N,计算并输出不大于 N 的最大素数。
输入格式
输入一个正整数 N (N > 1)
输出格式
满足条件的素数
运行代码:
m = int(input('输入一个正整数:')) for i in range(m, 1, -1): for j in range(2, i): if i % j == 0: break else: print(i) break
运行结果:
项目实训12:
四则运算
描述
用户输入两个数字,输出其加、减、乘、除运算的结果。
输入格式
输入两个数字
输出格式
分四行输出其加、减、乘、除运算的结果
运行代码:
a, b = map(int, input().split()) # 根据空格分隔 print(f'{a} + {b} = {a + b}') print(f'{a} - {b} = {a - b}') print(f'{a} * {b} = {a * b}') print(f'{a} / {b} = {a / b}')
运行结果:
项目实训13:
正整数A+B
描述
题的目标很简单,就是求两个正整数A和B的和,其中A和B都大于0。稍微有点麻烦的是,输入并不保证是两个正整数。
输入格式
输入在一行给出A和B,其间以空格分开。问题是A和B不一定是满足要求的正整数,有时候可能是超出范围的数字、负数、带小数点的实数、甚至是一堆乱码。
注意:我们把输入中出现的第1个空格认为是A和B的分隔。题目保证至少存在一个空格,并且B不是一个空字符串。
输出格式
如果输入的确是两个正整数,则按格式A + B = 和输出。如果某个输入不合要求,则在相应位置输出?,显然此时和也是?。
运行代码:
ls = input().split(' ') # 切分结果一定是2个对象,列表try: try: a = int(ls[0]) if a <= 0: a = '? ' except ValueError: a = ' ? ' try: b = int(ls[1]) if b <= 0: b = '? ' except ValueError: b = ' ?' if a == '?' or b == ' ? ': print(f'{a}+{b}=? ') else: print(f'{a}+{b}={int(a) + int(b)}')
运行结果:
项目实训14:
鸡兔同笼
大约在1500年前,《孙子算经》中就记载了这个有趣的问题。书中是这样叙述的:今有雉兔同笼,上有三十五头,下有九十四足,问雉兔各几何?
这四句话的意思是:有若干只鸡兔同在一个笼子里,从上面数,有35个头,从下面数,有94只脚。问笼中各有多少只鸡和兔?
请编一个程序,用户在同一行内输入两个整数,代表头和脚的数量,编程计算笼中各有多少只鸡和兔,假设鸡和兔都正常,无残疾。如无解则输出“Data Error!”
输入格式
在一行里输入两个整数,用空格分隔
输出格式
在一行里输出是鸡和兔的数量,输出格式如:有18只鸡,6只兔
如无解则输出“Data Error!”
输入:
35 94
输出:
有23只鸡,12只兔
输入:
100 5
输出:
Data Error!
运行代码:
head, foot = map(int, input().split(' ')) rabbit = (foot - head * 2) // 2 chicken = head - rabbit if (head >= 0) and (foot >= 0) and (foot - 2 * head) % 2 == 0 and rabbit >= 0 and chicken >= 0: print(f'有{rabbit}只兔子', f'有{chicken}只鸡') else: print('Data Error!')
运行结果:
项目实训15:
物不知数
“物不知数”出自《孙子算经》。题目为“今有物不知其数,三三数之剩二,五五数之剩三,七七数之剩二,问物几何?”意思是说有一些物品,不知道有多少个,3个3个数的话,还多出2个;5个5个数则多出3个;7个7个数也会多出2个。
假设物品总数不超过1000,请问这些个物品可能有多少个?
输入格式
输入一个正整数
输出格式
不超过输入数字且满足条件的物品个数
运行代码:
a = int(input('请输入一个正整数:')) for i in range(1, a): if i % 3 == 2 and i % 5 == 3 and i % 7 == 2: print(i)
运行结果:
项目实训16:
运行代码:
a = int(input('请输入一个整数:')) big, small = 1, 1 day = 0 big_s, small_s = 0, 0 while (a > 0): a = a - (big + small) if a < 0: a += (big + small) big_s += a / (big + small) * big small_s += a / (big + small) * small a = 0 else: big_s += big small_s += small day = day + 1 big = big * 2 small = small / 2 print(day) print(f'{big_s:.1f}', f'{small_s:.1f}')
运行结果:
项目实训17:
李白买酒
大诗人李白,一生好饮酒。一天,他提着酒壶,从家里出来,酒壶中有酒若干。他边走边唱:无事街上走,提壶去买酒,遇店加一倍,见花喝一斗,五遇店和花,喝光壶中酒,计算并输出壶中原有酒几斗?
运行代码:
wine = 0 for i in range(5): wine = wine + 1 wine = wine/2 print(wine)
运行结果:
项目实训18:
宝塔上的琉璃灯
有一座八层宝塔,每一层都有一些琉璃灯,每一层的灯数都是上一层的二倍,已知共有765盏琉璃灯,计算并输出每层各有多少盏琉璃灯。
运行代码:
for first in range(0, 766): sum1 = 0 ls = [] for i in range(8): lamp = first * 2 ** i ls.append(lamp) sum1 += lamp if sum1 == 765: print(ls) break
运行结果:
项目实训19:
个人所得税计算器
目前我国个人所得税计算公式如下:
应纳个人所得税税额= (工资薪金所得 -五险一金 - 个税免征额)×适用税率-速算扣除数
2018年10月1日起调整后,个税免征额为5000元/月,7级超额累进个人所得税税率表如下:
全月应纳税所得额(含税级距) 税率(%) 速算扣除数
不超过3,000元 3 0
超过3,000元至12,000元的部分 10 210
超过12,000元至25,000元的部分 20 1,410
超过25,000元至35,000元的部分 25 2,660
超过35,000元至55,000元的部分 30 4,410
超过55,000元至80,000元的部分 35 7,160
超过80,000元的部分 45 15,160
请编写一个个人所税计算器,用户输入应发工资薪金所得、五险一金金额和个税免征额,输出应缴税款和实发工资,结果保留小数点后两位。当输入数字小于0或等于0时,输出“error”。
测试用例
输入(冒号前是提示性文字,冒号后的数字为用户输入)
请输入应发工资薪金金额:16000
请输入五险一金金额:4000
请输入个税免征额:5000
应缴税款490.00元,实发工资15510.00元。
输出
应缴税款490.00元,实发工资11510.00元。
运行代码:
salary = float(input("请输入应发工资薪金金额:")) # salary应发工资薪金所得 five_one_insurance_fund = float(input("请输入五险一金金额:")) # 五险一金 exenption = float(input("请输入个税免征额:")) # exenption个税免征额 taxable = salary - five_one_insurance_fund - exenption if taxable < 0: tax = 0 else: if taxable <= 3000: tax_rate = 0.03 deduction = 0 elif taxable <= 12000: tax_rate, deduction = 0.1, 210 elif taxable <= 25000: tax_rate, deduction = 0.2, 1410 elif taxable <= 35000: tax_rate, deduction = 0.25, 2660 elif taxable <= 55000: tax_rate, deduction = 0.3, 4410 elif taxable <= 80000: tax_rate, deduction = 0.35, 7168 else: tax_rate, deduction = 0.45, 15160 tax = taxable * tax_rate - deduction print(f'应缴纳税款{tax:.2f}元,实发工资{(salary-five_one_insurance_fund-tax): .2f}元')
运行结果:
项目实训20:
计算圆周率
中国是世界四大文明古国之一,在数千年的历史中,中华民族以不屈不挠的顽强意志、勇于探索的精神和卓越的聪明才智,谱写了波澜壮阔的历史画卷,创造了同期世界历史上极其灿烂的物质文明与精神文明。公元前一世纪出现的《周髀算经》是现存我国最古老的数学著作,其中叙述了勾股定理。公元一世纪的《九章算术》是对战国、秦汉时期我国人民所取得的数学系统总结,标志着我国古代数学体系的初步形成。
而究其具体内容,《九章算术》处理计算了大量复杂的问题。前面所列的九个分类中,包括了246个问题,以及202个“术”。其中有线型和圆型图形等多种几何图形的体积算法、面积算法等;有开平方术、开立方术;二项二次、二项三次等方程的解法;还有应用勾股定理解决问题的各种算法等等。从这些例子可看出其以计算为中心的特点。从数学内容上,九章算术不仅处理了大量复杂问题,而且包含了极限,分割,组合等重要的哲学思想和朴素的积分思想。
东西方两种不同数学发展意味着两种数学思想孕育在其中,一种是公理化思想,源于希腊。而整个中国古代数学贯穿了机械化思想,因中国古代数学是算法化,造就中国古代数学机械化思想更加适合数学的机械化,也更加适应计算机的发展,例如圆周率的计算,中国古代采用的割圆法就体现了迭代和极限的概念,方便计算机实现。
轮子是古代的重要发明,给人们的生产和生活带来了极大的方便。由于轮子的普遍使用,人们很自然地想到这样一个问题:一个轮子转一圈可以走多远?很显然,轮子越大,转动的距离越长,那么转动的距离与轮子的直径之间有什么关系呢?
人们最早用测量的方法来解决这个问题,经许多的人多次测量后,人们发现了圆的周长总是其直径的3倍多一些。在我国,现存的圆周率的最早记载是2000多年前的中国古算书《周髀算经》(约公元前2世纪)的中有“径一而周三”的记载,意即取π=3。汉朝时,张衡(78年—139年)得出π2/16=5/8,即π= ,约为3.162。
用测量的方法计算圆周率,圆周率的精确程度就取决于测量的精确程度,而众多的历史因素和许多实际的困难限制了测量的精度。
我国古代数学经典《九章算术》在第一章“方田”章中写到“半周半径相乘得积步”,为了证明这个公式,我国魏晋时期数学家刘徽于公元263年撰写《九章算术注》,在这一公式后面写了一篇1800余字的注记,这篇注记就是数学史上著名的“割圆术”。“割圆术”,则是以“圆内接正多边形的面积”,来无限逼近“圆面积”。刘徽形容他的“割圆术”说:割之弥细,所失弥少,割之又割,以至于不可割,则与圆合体,而无所失矣。这包含了求极限的思想。通过圆内接正多边形细割圆,并使正多边形的周长无限接近圆的周长,进而来求得较为精确的圆周率。
刘徽给出π=3.141024的圆周率近似值,刘徽在得圆周率=3.14之后,将这个数值和晋武库中汉王莽时代制造的铜制体积度量衡标准嘉量斛的直径和容积检验,发现3.14这个数值还是偏小。于是继续割圆到1536边形,求出3072边形的面积,得到令自己满意的圆周率。
图4.1 割圆法计算圆周率原理
设圆半径为1,圆内接正6边形边长也为1,计算正12边形的边长:
OC可用勾股定理计算:
新的边长AD值为:
编程实现割圆法计算圆周率,并输出分割不同次数时边数、圆周率值以及计算所得圆周率值与math库中的圆周率值的偏差。
输入:4
输出:
分割4次,边数为96,圆周率为3.14103195089051
相对math.pi偏差0.000560702699283322
输入:20
输出:
分割20次,边数为6291456,圆周率为3.141592653589663
相对math.pi偏差1.3011813848606835e-13
运行代码:
import math def cutting_circle(n): # n为分割次数 side_length = 1 # 初始边长 edges = 6 # 初始边数 for i in range(n): height = 1 - math.sqrt(1 - (side_length / 2) ** 2) side_length = math.sqrt(height ** 2 + (side_length / 2) ** 2) edges = edges * 2 pi = side_length * edges / 2 return edges, pi if __name__ == '__main__': times = int(input()) print('分割{}次,边数为{},圆周率为{}'.format(times, *cutting_circle(times))) print(f'math库中的圆周率常量值为{math.pi}')
运行结果:
本章总结:
本章历时一个周完成,期间阳了,身体不舒服,断断续续写了一些,现在终于完成。本章有许多例题,学习过程中还是要勤加练习,多敲代码,做到理解并运用,然后才熟练掌握,感谢大家的支持!!!