一、前提声明
1、什么是模拟算法
模拟算法是一类算法,它们通过模拟系统、过程或事件的行为,以便在计算机上对这些行为进行模拟。这种算法通常用于模拟现实世界中的复杂系统或情境,以便更好地理解其行为、观察其性能,或者预测其未来的状态,即用代码去模拟题意算出结果。
模拟算法的优点:精度高:模拟算法通常能够给出相对准确的结果,因为它们可以通过对模型的精确控制和调整来获取所需的精度。缺点:时间复杂度过高,很多题的数据模拟通过不了全部数据,需要根据题目来选择优化方法
模拟算法的一般步骤包括:
1、建模: 定义要模拟的系统或过程的数学模型。这通常包括描述系统组成部分、它们之间的关系,以及系统如何响应外部输入等。
2、初始化: 设定模型的初始状态,包括系统中各个组成部分的初始值。
3、模拟: 按照一定的时间步长或事件触发条件,模拟系统的演变。在每个时间步或事件发生时,根据模型的规则更新系统的状态。
4、数据收集: 收集模拟过程中的关键信息,以便分析和评估系统的性能、行为或其他属性。
5、分析: 分析收集到的数据,获得关于模拟系统的洞察,可能包括对系统的优化或改进建议。
模拟算法在许多领域都有应用,例如:
1、物理学: 模拟粒子在空间中的运动,天体运动等。
2、生物学: 模拟生态系统、人口动态等。
3、经济学: 模拟市场行为、经济周期等。
4、交通规划: 模拟车辆流动、交通信号控制等。
5、通信网络: 模拟数据包传输、网络拓扑等。
6、制造业: 模拟生产线、供应链等。
模拟算法的关键优势在于它们可以提供对复杂系统行为的深入理解,而无需实际操作或观察真实系统。
二、习题练习
1、模拟分类(21年真题)
小蓝发现,对于一个正整数n和一个小于n的正整数v,将v平方后对n取余可能小于n的一半,也可能大于等于n的一半。
请问,在1到n-1中,有多少个数平方后除以n的余数小于n的一半。例如,当n =4时,1,2,3的平方除以4的余数都小于4的一半。
又如,当n =5时,1,4的平方除以5的余数都是1,小于5的一半。而2,3的平方除以5的余数都是4,大于等于5的一半。
def count_number(n):
count = 0
half_n = n // 2
for v in range(1,n):
square_remainder = (v**2) % n
if square_remainder < half_n:
count += 1
return count
if __name__ == '__main__':
n1 = 4
n2 = 5
result1 = count_number(n1)
result2 = count_number(n2)
print(f'当n={n1}时,满足条件的个数为:{result1}')
print(f'当n={n2}时,满足条件的个数为:{result2}')
2、数位求和(21年真题)
小明对数位中含有2、0、1、9的数字很感兴趣(不包括前导0),在1到40中这样的数包括1、2、9、10至32、39和40,共28个,他们的和是574。
请问,在1到n中,所有这样的数的和是多少?
def sum_special_numbers(n):
special_numbers_sum = 0
for num in range(1,n+1):
# 将数字转换为字符串 ,一便检查每个数字的位数
num_str = str(num) # 如'50'
# 判断数字是否包含2、0、1、9
if '2' in num_str or '0' in num_str or '1' in num_str or '9' in num_str:
special_numbers_sum += num
return special_numbers_sum
if __name__ == '__main__':
n = 60
result = sum_special_numbers(n)
print(f'在1到{n}中,所有包含2、0、1、9的数的和是:{result}')
3、数位求和
假设小明对数位中含有奇数的数字感兴趣,他想知道在1到50之间,所有数位中含有奇数的数的和是多少。
'''
假设小明对数位中含有奇数的数字感兴趣,他想知道在1到50之间,所有数位中含有奇数的数的和是多少。
for digit in '13579': 这部分创建了一个循环,迭代字符串 '13579' 中的每个字符,即 '1'、'3'、'5'、'7'、'9'。
digit in num_str: 对于循环中的每个字符(即奇数),检查它是否在数字的字符串表示中。
any(...): 这是一个内置函数,用于判断括号内的任何条件是否为 True。在这里,它会检查是否存在任何一个奇数字符在数字字符串中。
'''
def sum_number(n):
numbers_sum = 0
for num in range(1,n+1):
# 将数字转换为字符串,以便检查位数
num_str = str(num)
# 判断是否含有奇数
if any(digit in num_str for digit in '13579'):
numbers_sum += num
return numbers_sum
if __name__ == '__main__':
n = 50
result = sum_number(n)
print(f"在1到{n}中,所有包含奇数的数的和是:{result}")