#1 基本循环

本文详细介绍了Python中的for-in循环以及其在整数处理、质数和合数判断、闰年计算、自整除数判定、角谷猜想和对称数检查等数学问题中的应用,同时探讨了while循环和continue语句的使用。
摘要由CSDN通过智能技术生成
1. 最基本的 for-in 循环:
#eg1:

for i in range[1,11):
    print("hello world!")

# for后的变量(此处为i)只是一个普通变量,可以不事先定义。
# range(start,end,step) ,step是间隔,三个参数都必须整数
# step如果省略,默认是1
# range(N):N是整数,相当于range(0,N),从0开始不包括N,即[0,N)
#eg2:利用for-in求和

sum = 0
for i in range(-10,11,3):
    sum = sum + i
print("和为",sum)

变量 sum 在每一次 i 循环中都 +i ,在循环结束后输出 sum 的值即为范围内 i 的总和。

2. 应用
2.1 简单的因数问题

只要在 for-in 循环中间加入条件限制的 if 语句即可。

# eg1: 1-100之间能被3、7都整除的数

for i in range(1, 100 + 1):   
    if i % 3 == 0 and i % 7 == 0:
        print(i)
# eg2: 找出 2000 到 3200 之间可以被 7 整除,但不能被 5 整除的所有数
# 输出: 所有满足条件的整数,以逗号分隔

for i in range(2000,3200):
    if i % 7 == 0:
        if i % 5 != 0:
            print(i,end = ",")

# 改写:if i % 7 == 0 and i % 5 != 0:
# 改写2: and 变为 or,则意义变为?
# eg3: 输出N的全部因数
N = int(input("请输入正整数:"))

for i in range(1,N + 1):
    if N % i == 0:
        print(i)

由上面两个实例我们知道了判断整除的语句,由此可以尝试验证/寻找质数/合数:

质数即正整数集中只能被1和自身整除的数,合数即除此和1以外的所有数。

可以先从判定较为简单的质数入手,下面是质数判断的几种不同方法:

方法1:

N = int(input("请输入正整数:"))

count = 0 # 记录整除的次数

for i in range(1, N + 1):
    if N % i == 0:
        count = count + 1

if count == 2:
    print(f"{N}是质数")
else:
    print(f"{N}不是质数") # 1只被能被整除1次,已经排除在外

方法2: 方法1的优化,无需求出每个i的因数的count值

N = int(input("请输入正整数:"))

count = 0 

for i in range(2, N+1):
    if N % i == 0:
        count = count + 1
        break 

# 只中断break语句所在的这一层循环,即中断这个i下的if循环;外层for-in循环依然继续

print("count = ", count)

# 实际上,输出的count值只可能为0或1.只要count值不为0,即意味着不为质数,先前又已经剔除了1,那么i即为合数

if count == 0:
    print(f"{N}是质数")
else:
    print(f"{N}是合数")

方法3: 利用布尔变量(True/False语句)判定代替count 0/1

N = int(input("请输入正整数:"))

Flag = True # False即状态改变,表示是质数

for i in range(2, N//2 + 1): #整除
    if N % i == 0:
        Flag = False
        break 
    
print("count = ", Flag)

if Flag == True:
    print(f"{N}是质数")
else:
    print(f"{N}不是质数")

方法4: 基于以上程序的进一步优化。如果N的值比较大,将 (2, N+1) 全部遍历效率比较低,故考虑如何在减少遍历范围达到相同判定效果:

对于N,判定其是否存在1和自身以外的因数i,实际上意味着 (2, N+1) 范围内有两个的数i_{1}i_{2}i_{1} <= i_{2}),满足i_{1} \times i_{2} = N;找到了i_{1}就意味着i_{2}的存在。所以实际上只要从2开始,遍历到最大的i_{1},即可找出N的所有因数对 (i_{1}, i_{2})。

那么,由\max i_{1} <= \sqrt{N},可知遍历到\sqrt{N}就已经能够保证遍历所有可能的因数对。

对于N,即使事先并不知道其具体的每个因数,但一定存在\sqrt{N};如果其为整数,则N为完全平方数,自然是合数;如果其不为整数,由于 range() 内 end 须为整数,那么就取比\sqrt{N}大的最小整数,以保证能遍历到比\sqrt{N}小的最大整数。实现如下:

# 修改处:

for i in range(2, int(N ** 0.5) + 1):    
2.2 因数问题的扩展应用
2.2.1 闰年问题

关键在于能被4整除的数中还要进一步剔除能被100但不能被400整除的数。

# 求给定年份是否为闰年

Year = int(input())

if Year % 4 == 0:
    if Year % 100 == 0 and Year % 400 != 0:
        print("Year","不是闰年")
    else:
        print("Year","是闰年")
else:
    print("Year","是闰年")
2.2.2 求合数和
# 求指定范围内合数和

A = int(input())
B = int(input())

asum = 0

for i in range(A,B):
    if i == 2:
        pass
    elif i > 2: 
        for j in range(2,i):
            if i % j == 0:
                asum += i # 相当于 asum = asum + i
                break

print(asum)

以上过程中先判定合数,再相加,因此将for-in循环进行了嵌套。

同样,可以参考2.1中判定质数的多种方法进行改写,此处略。

2.2.3 自整除数

自整除数即能被各个数位上的数字相加的数整除的数。

所有的个位数都是自整除数;要判定的是较大的数是否为自整除数。

方法1:

N = int(input())

primary = N # 将N保存到primary,保持不变,N变化
Total = 0

for i in range(1,N + 1):
    
    GeWei = N % 10 
    Total = Total + GeWei
    N = N // 10

    if N == 0 : 
        break
    
if primaryNum % Total == 0: 
    print("YES")
else:
    print("No")

方法2: 利用字符串也能被for-in遍历的特性

N = input() # 输入为字符串

Sum = 0 

for i in N: # N是字符串,字符串也可以被for-in遍历,即逐一取出放入in之前的变量
    
    Sum = Sum + int(i) # 将一个数字转换为整数
    
if int(N) % Sum == 0:
    print("Yes")
else:
    print("No")
3. for-in 循环的进阶:while 循环
 3.1 用 while 语句来表示 for-in 循环:
# eg1: 求和

i = 1
Sum = 0
while i <= 100:
    Sum += i
    i += 1
print(Sum)

# eg2: 质数判定
# 修改处:

loopNum = 2

while loopNum < N:
    if N % loopNum == 0:
        Flag = False #不是质数
        break
    loopNum += 1    

可以发现,while 循环只需指出循环维续的条件,而无需为循环指定起点、终点和步长。这意味着它在可以代替 for-in 这种固定循环的功能的同时,实现更多不事先指定循环长度的功能。

只要 while 后的条件表达式结果为True,就一直循环。

3.2 while True - break 循环:

1. 和 3.1 中的循环都是有固定终点的,而 while True 配合 break 语句可以在程序运行的时候自己控制终点。

while 后语句的结果不再受其后表达式的影响,即为 True,即循环永续;

但仍然需要将循环停止,所以为其指定停止的出发条件,再用 break 终止 while 循环。

# eg:

while True:
    word = input('Please enter a word: ')
    
    if word == "stop": 
        break
    
    print('The word was ', word)


只要输入的内容不是“word“,就可以一直输入并得到即时输出。

4. while 循环的应用
4.1 角谷猜想
count = 0 # 记录直至结果为1的处理次数

while N != 1:

    if N % 2 == 0:
        N = N // 2
    else:
        N = N * 3 + 1

    count += 1

    print(N,end = " ")

print(count)

4.2 对称数的判断
N = int(input())

primaryNum = N
newNum = 0 

while N != 0:
    newNum = newNum * 10 + N % 10 # 最关键,N % 10得到个位数
    N = N // 10 # 去除个位数
    
if newNum == primaryNum:
    print("Yes")
else:
    print("No")
5. 补充:continue 语句
# 求给定数的所有因数

N = int(input())

i = 2

while N != 1:

    if N % i == 0:
        print(i)
        N = N // i
        continue # 继续循环,但不执行continue所在循环体后的语句

    i += 1

  • 20
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值