Demo37
这里的问题是猜出电脑里存储的数字是什么。你将要编写一个能够随机生成一个0到100之间且包括0和100的数字的程序。这个程序提示用户连续地输入数字直到它与那个随机生成的数字相同。对于每个用户输入的数字,程序会提示它是否过高还是过低,所以,用户可以更明智地选择下一个输人的数字。下面是一个简单的运行:
"""
数据:电脑随机产生一个数字 用户输入数据
步骤:
0.随机产生一个数字
1.提示用户输入一个数字
2.对该数字和随机数字进行比较
2.1 如果相等 则猜中 程序结束
2.2 如果大于 提示大了 继续执行1
2.3 如果小于 提示小了 继续执行1
"""
import random
com = random.randint(0, 100) # [0,100] range(0,100) # [0,100)
while True:
# 1
num = int(input("Enter a number:"))
# 2.1
if num == com:
print("Yes ,the number is", com)
break
# 2.2
elif num > com:
print("Your guess is too high")
# 2.3
else:
print("Your guess is too low")
Demo38
两个整数4和2的最大公约数(GCD)是2。整数16和24的最大公约数是8。怎样找出最大公约数呢?假设输人的两个整数是nl和n2。你知道数字Ⅰ是它们的公约数,但它并不是最大公约数。所以,你要检测k(k=2、3、4、…)是否为nl和n2的公约数,直到k大于n1或n2。把公约数存储在一个名为ged的变量中。初始状态时,ged 的值为1。每找到一个新的公约数就把它赋给gcd。当你检测完从2到n1或从2到n2的所有可能公约数后,存储在gcd中的值就是最大公约数。
"""
数据:两个数字num1 num2 gcd 所有可能的除数min(num1,num2)
步骤:
1.提示输入两个数字
2.取两者的最小值min 开始遍历 2~min
3.在遍历的过程中 如果 除数 能够把num1 num2都整除 gcd 更新为此数字
4.直到所有的可能都遍历结束 gcd最终的最大公约数
"""
num1, num2 = eval(input("Enter two numbers:"))
k = min(num1, num2)
gcd = 1
for i in range(2, k + 1):
if num1 % i == 0 and num2 % i == 0:
gcd = i
print(gcd)
Demo39
蒙特卡罗模拟使用随机数和概率来解决问题。它在计算机数学、物理、化学和经济方面
都有非常广泛的应用。现在,我们看一个使用蒙特卡罗模拟来估计兀
的例子。首先,绘制一个带外接正方形的圆。假设这个圆的半径为1。因此,这个圆的面积就是北,而矩形的面积为4。在这个正方形内随机产生一个点。这个点落在圆内的概率为
circlcArea/squareArea=元π4。编写一个程序,在正方形内随机产生1 000 000个点.使用
numberOfHits表示落人圆内点的个数。所以,numberOfHits大约就是 100 000* ( x/4)。π
就可以被近似表示为4*numberOfHits/1 000 000
"""
数据:总点数total 落入圆内的点数num 若干个随机的坐标
步骤:
1.开启循环 1~1000000
2.每次循环 随机生成一个坐标 x∈[-1,1] y∈[-1,1]
2.1 如果坐标在圆内 num += 1
3.循环结束后 π = num / total * 4
"""
import random
num = 0
total = 1000000
for i in range(0, total):
# [0,1) * 2 => [0,2) - 1 =>[-1,1)
x = random.random() * 2 - 1
y = random.random() * 2 - 1
distance = (x ** 2 + y ** 2) ** 0.5
if distance <= 1:
num += 1
pi = num / total * 4
print(pi)
Demo40
(统计正数和负数的个数然后计算这些数的平均值)编写一个程序来读入不指定个数的整数,然后
决定已经读取的整数中有多少个正数和多少个负数并计算这些输入值(不统计0)的总和,最终得出它们的平均值。这个程序以输人值О来结束。使用浮点数显示这个平均值。下面是一个简单的示例运行。
"""
数据:正数的个数 负数的个数 总和 平均值
positives negatives sum average
步骤:
1.提示用户输入一个数字
2.对该数字进行判断
2.1 如果该数字为0 则循环结束
2.2 如果该数字 > 0 positives += 1 sum += 数字 继续1
2.3 如果该数字 < 0 negatives += 1 sum += 数字 继续1
3.计算平均值 = 总和 / (正 + 负)
如果 总个数 为 0 则输出没有任何数字输入
"""
positives = 0
negatives = 0
sum = 0
while True:
num = int(input("Enter a number:"))
if num == 0:
break;
elif num > 0:
positives += 1
else :
negatives += 1
sum += num
total = positives + negatives
if total == 0:
print("You didn't enter any number")
else :
print("The number of positives",positives)
print("The number of negatives",negatives)
print("The sum is",sum)
print("The average is",sum / total)
Domo41
(找出一个整数的所有因子)编写程序读取一个整数,然后显示它所有的最小因子,也称之为素
因子。例如:如果输人整数为120,那么输出应该如下所示。
2,2,2,3,5
number = int(input("Enter a number:"))
while number != 1:
flag = True # 循环是否正常结束
for i in range(2, number // 2 + 1):
if number % i == 0:
print(i, end=" ")
number = number // i
flag = False
break
if flag :
print(number)
break
"""
else : # 针对for循环的 不是for中的可能
print(number)
break
"""
Demo42
(显示一个金字塔)编写程序提示用户输人一个在1到15之间的整数,然后显示一个金字塔,示
例运行如下所示。
for i in range(0, 7):
for k in range(6 - i, 0, -1):
print(" ",end=" ")
for j in range(-i, i + 1):
print(abs(j) + 1, end=" ")
print()
print('=模式A '*5)
for i in range(1, 7):
for j in range(1, i+1):
print(j, end=" ")
print()
print('=模式B '*5)
for i in range(7, 1,-1):
for j in range(1, i):
print(j, end=" ")
print()
print('=模式c '*5)
for i in range(1, 7):
for k in range(6-i,0,-1):
print(' ',end=' ')
for j in range(i,0,-1 ):
print(j, end=" ")
print()
print('=模式D ' * 5)
for i in range(7, 1,-1):
for k in range(0,7-i):
print(' ',end=' ')
for j in range(1, i):
print(j, end=" ")
print()
Demo44
(在金字塔模式中显示数字)编写一个嵌套for循环来显示下面的输出。
for i in range(0, 8):
for k in range(8-i,0,-1):
print(' ',end=' ')
for j in range(-i, i + 1):
print(2 ** (i - abs(j)), end=" ")
print()
Demo45
(显示在2和1000之间的素数)修改程序清单5-13,显示在2和1000之间且包括2和1000的
素数,每行显示8个素数。
count = 0
for num in range(2,1001):
for j in range(2, num):
if num % j == 0:
break;
else:
print(num,end = "\t")
count += 1
if count % 8 == 0:
print()
for j in range(10000,100000,10000):
item = e = 1
for i in range(1,j+1):
item *= i
e += 1 / item
print('i = ',i,'e= ',e)
for j in range(10000,100000,10000):
item = e = 1
for i in range(1,j+1):
item *= i
e += 1 / item
print('i = ',i,'e= ',e)
Domo48
(完全数)如果一个正整数等于除了它本身之外所有正因子的和,那么这个数被称为完全数。例如,6是第个完全数,因为6=3+2+1。下一个完全数是28=14+7+4+2+1。小于10 000的完全数有四个。编写程序找出这四个数。
for i in range(1,10001):
total = 0
for j in range(1,i):
if i % j == 0:
total += j
if total == i:
print(i)
Demo49
(游戏:石头、剪刀、布)编程题4.17给出玩石头、剪刀、布游戏的程序。改写程序让用户不断
玩直到用户或计算机中的某一方能够赢得游戏超过两次。
import random
com_win = 0
usr_win = 0
while True:
com = random.randint(0, 2)
usr = int(input("Please start with 1=rock, 2=scissors、3=paper:"))
if usr - com == 1 or usr - com == -2:
usr_win += 1
print('com:',com,'usr:',usr,'usr_win ')
elif usr == com:
print('com:',com,'usr:',usr,'dogfall')
else:
com_win += 1
print('com:',com,'usr:',usr,'com_win ')
if com_win ==3 or usr_win == 3 :
if com_win > usr_win:
print('The computer won the day')
break
else:
print('The player wins the final victory')
break
Demo50
(最大数的出现)编写程序读取整数,找出它们中的最大值,然后计算它的出现次数。假设输入
以数字0结束。假设你输人的是“3525550”;程序找出的最大数是5,而5的出现次数是4。(提示:维护两个变量max和count。变量max存储的是当前最大数,而count存储的是它的出现次数。初始状态下,将第一个值赋值给max,将1赋值给count。将max和每个随后的数字进行比较。如果这个数字大于max,就将它赋值给max且将count重置为1。如果这个数等于max,给count自增1。)
max = 0
count = 0
while True:
num = int(input("Enter a number:"))
if num == 0:
break
if num > max:
max = num
count = 1
elif num == max:
count += 1
print("max = ",max)
print("count = ",count)
Demo51
(十进制到二进制)编写程序提示用户输人一个十进制整数,然后显示它对应的二进制数。
num = int(input('Please enter a decimal number:'))
num = bin(num)
print('The result of converting to binary is:',num)
其中结果中的b代表二进制的意思
Demo52
(十进制到十六进制)编写程序提示用户输人一个十进制数,然后显示它对应的十六进制数。
num = int(input('Please enter a decimal number:'))
num = hex(num)
print('The result of converting to binary is:',num)
Demo53
(蒙特卡罗模拟)一个正方形被分为四个更小的区域,如图a所示。如果你投掷一个飞镖到这个正方形
一百万次,这个飞镖落在一个奇数区域里的概率是多少?编写程序模拟这个过程然后显式结果。(提示:
将这个正方形的中心放在坐标系统的中心位置,如图b所示。在正方形中随机产生一个点,然后统计这个
点落人奇数区域的次数。)
import random
count = 0
for i in range(0,1000000):
x = random.random() * 2 - 1
y = random.random() * 2 - 1
if -1 <= x <= 0 and -1 <= y <= 1:
count += 1
if 0 <= x <= 1 and 0 <= y <= 1 and y / (1 - x) <= 1:
count += 1
print("飞镖落在奇数区域的概率是:%f"%(count / 1000000))
Demo54
(显示闰年)编写程序显示21世纪(从2001年到2100年)里所有的闰年,每行显示10个闰年。这些年被一个空格隔开。
count = 0
print('The leap year of the 21st century is:')
for i in range(2001,2101):
if(i % 4 == 0 and i % 100 != 0) or (i % 400 == 0):
print(i,end=' ')
count += 1
if count % 10 == 0 :
print()