蓝桥杯软件类考点5:模拟

一、前提声明

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}")

  • 7
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值