2023编程练习题第二章

Demo27 打印数字I

题目描述
利用循环,寻找规律,打印如下数字模式:

模式A
1
1 2
1 2 3
1 2 3 4
1 2 3 4 5
1 2 3 4 5 6
模式B
1 2 3 4 5 6
1 2 3 4 5
1 2 3 4
1 2 3
1 2
1
模式C
          1
        2 1
      3 2 1
    4 3 2 1
  5 4 3 2 1
6 5 4 3 2 1
模式D
1 2 3 4 5 6
  1 2 3 4 5
    1 2 3 4
      1 2 3
        1 2
          1
print("模式A")
n = 6

for i in range(1 , n + 1) :
    for j in range(1 , i + 1) :
        print(j , end=" ")
    print()

print("模式B")
n = 6

for i in range(1 , n + 1) :
    for j in range(1 , n - i + 2) :
        print(j , end=" ")
    print()

print("模式C")
n = 6 

for i in range(1 , n + 1) :
    for j in range(n - i, 0 , -1) :
        print(" " , end=" ")
    for k in range(i , 0 , -1) :
        print(k , end=" ")
    print()

print("模式D")
n = 6
for i in range(1 , n + 1) :
    for j in range(0 , i - 1) :
        print(" " , end=" ")
    for k in range(1 , n + 2 - i) :
        print(k , end=" ")
    print()

Demo28 打印数字II

题目描述
利用循环,寻找规律,打印如下数字模式:

            1
          2 1 2
        3 2 1 2 3
      4 3 2 1 2 3 4
    5 4 3 2 1 2 3 4 5
  6 5 4 3 2 1 2 3 4 5 6
7 6 5 4 3 2 1 2 3 4 5 6 7
n = 7 

for i in range(1 , n + 1) :
    for j in range(1 , n - i + 1) :
        print(" " , end=" ")
    for k in range(i , 0 , -1) :
        print(k , end=" ")
    for l in range(2 , i + 1) :
        print(l , end=" ")
    print()

Demo30 打印菱形I

题目描述
如下所示,是一个高度为9的菱形

    *
   * *
  * * *
 * * * *
* * * * *
 * * * *
  * * *
   * *
    *

用户输入菱形高度n,并打印出该高度下的菱形
输入输出描述
输入高度n,n为奇数
输出该高度的菱形

Demo31 打印菱形II

题目描述
如下所示,是一个高度为9的菱形

    *
   * *
  *   *
 *     *
*       *
 *     *
  *   *
   * *
    *

用户输入菱形高度n,并打印出该高度下的菱形
输入输出描述
输入高度n,n为奇数
输出该高度的菱形

n = int(input())

for i in range(1 , n // 2 + 2) :
    print(" " * (n - i) , end="")
    for j in range(2 * i - 1) :
        if j == 0 or j == 2 * i - 2 :
            print("*" , end="")
        else :
            print(" " , end="")
    print()
for i in range(n // 2 , 0 ,-1) :
    print(" " * (n - i) , end="")
    for j in range(2 * i - 1) :
        if j == 0 or j == 2 * i - 2 :
            print("*" , end="")
        else :
            print(" " , end="")
    print()

Demo34 最大公约数I

题目描述
输入两个正整数,计算其最大公约数,例如4和2的最大公约数是2,16和24的最大公约数是8
输入输出描述
输入两个数字
输出最大公约数

a,b = map(int,input().split())

list = []
for i in range(1,11) :
    if a % i == 0 :
        j = i
        if b % j == 0 :
            list.append(j)
print(list[-1])

Demo36 最小公倍数

题目描述
输入两个正整数,计算其最小公倍数,例如4和2的最小公倍数是4,3和5的最小公倍数是15
输入输出描述
输入两个正整数
输出最小公倍数

a,b = map(int,input().split())
list = []

for i in range(1,101) :
    if a * i == b :
        print(b)
    elif b * i == a :
        print(a)

for j in range(1 , 101) :
    a1 = a * j
    for k in range(1 , 101) :
        b1  = b * k
        if a1 == b1 :
            list.append(a1)

print(list[0])

Demo37 整数的素因子

题目描述
输入一个正整数,然后找出它所有的最小因子,也称之为素因子
输入输出描述
输入一个正整数
输出多行,每行输出一个素因子

num = int(input())
list = []
i = 2

while i < 1000000 :
    if num % i == 0 :
        list.append(i)
        num = num / i
    elif num % i != 0 : 
        i += 1
        continue
while num == 0 :
    break
for j in list :
    print(j , end=" ")

Demo38 完全数

题目描述
如果一个正整数等于除了它本身之外所有正因子的和,那么这个数称为完全数
例如 6 = 3 + 2 + 1,28 = 14 + 7 + 4 + 2 + 1
输入输出描述
输入一个正整数
输出该数是否为完全数

num = int(input())
list = []
a = 0 

for i in range(1 , 100000) :
    if num % i == 0 :
        if num != i :
            list.append(i)
        else :
            continue  

for j in list :
    a = a + j

if a == num :
    print("Yes")
else :
    print("No")

Demo40 计算π

题目描述
你可以使用下面的数列近似计算π
π = 4 ( 1 − 1 3 + 1 5 − 1 7 + 1 9 − 1 11 + . . . + ( − 1 ) i + 1 2 i − 1 ) π=4(1-\frac{1}{3}+\frac{1}{5}-\frac{1}{7}+\frac{1}{9}-\frac{1}{11}+...+\frac{(-1)^{i+1}}{2i-1}) π=4(131+5171+91111+...+2i1(1)i+1)
当i越大时,计算结果越近似于π

num = int(input())
jian = 0
jia = 0

for i in range(1 , num + 1) :
    if i % 2 == 0 :
        jian = ((-1 ** (i + 1)) / (2 * i) - 1)
        if i >= 2 :
            jian += jian
    elif i % 2 != 0 :
        jia = ((1 ** (i + 1)) / (2 * i) - 1)
        if i > 2 :
            jia += jia 

print(f"pi = {4 * (jia + jian)}")

Demo43 组合问题I

题目描述
在数字范围[1,7]之间,任意选择两个不相同的数作为一个组合,输出每一组组合,并统计所有组合的个数
注:组合(a,b)与组合(b,a)算同一种组合,只记录一次

count = 0
for i in range(2 , 8) :
    a = i 
    for j in range(1 , 8) :
        b = j
        if a == b :
            continue
        elif a != b and b < a:
            print(a,b)
            count += 1
print(f"共{count}次")

Demo44 组合问题II

题目描述
有1、2、3、4这个四个数字,能组成多少个互不相同且无重复数字的三位数?分别又是多少?

count = 0

for i in range(1 , 5) :
    a = i 
    for j in range(1 , 5) :
        b = j
        for k in range(1 , 5) :
            c = k
            count += 1
            if a != b and a != c and b != c :
                print(f"{100 * a + 10 * b + c}")
print(f"共{count}个")

Demo46 青蛙跳台阶

题目描述
一只青蛙,一次可以跳一个台阶或者两个台阶,现有n个台阶,问该青蛙有多少种不同的跳法?
例如:两个台阶,有两种跳法(1+1,2);四个台阶,有五种跳法(1+1+1+1,2+1+1,1+2+1,1+1+2,2+2)

n = int(input())

if n == 1 :
    print(f"{1}种")
elif n == 2 :
    print(f"{2}种")
elif n > 2 :
    print(f"{(n - 1) + (n - 2)}种")

Demo47 堆叠相加

题目描述
现有堆叠相加模式 a + a a + a a a + a a a a + a a a a a + . . . . . . a+aa+aaa+aaaa+aaaaa+...... a+aa+aaa+aaaa+aaaaa+......
例如: 2 + 22 + 222 + 2222 + 22222 2+22+222+2222+22222 2+22+222+2222+22222,其中a为2,且有5组数字
输入输出描述
输入两个数据分别为数字a和组数n
输出按照堆叠相加模式算出的和

a,n = map(int,input().split())
num = a
b = 0
a1 = a

for i in range(1 , n) :
    if a == 1 :
        num = a
    elif a > 1 :
        
        a1 = 10 * a1 + a
        b = a1
        num += a1 
print(num)

Demo48 十进制转二进制

题目描述
输入一个十进制正整数,输出其二进制形式
输入输出描述
输入一个十进制正整数
输出二进制字符串

num = int(input())
s = ""

while num > 0 :
    s = str(num % 2) + s
    num //= 2 

print(s)

Demo49 二进制转十进制

题目描述
输入一个二进制字符串,输出其对应的十进制数字
输入输出描述
输入一个二进制字符串
输出十进制数字

num = input("")
a = 0
length = len(num)

for x in range(length):
    a += int(num[length-1-x]) * pow(2, x)

print(a)

Demo52 最长公共前缀

题目描述
给定两个字符串 s1 和 s2 ,求两个字符串最长的公共前缀串,字符区分大小写
输入输出描述
输入两行,分别表示s1和s2
输出前缀串

s1 = str(input())
s2 = str(input())
list = []

for i in s1 :
    for j in s2 :
        if i == j :
            list.append(i)

for x in list :
    print(x , end="")

Demo53 子串出现的次数

题目描述
给定两个字符串 s1 和 s2 ,求 s2 在 s1 中出现的次数,字符区分大小写,已匹配的字符不计入下一次匹配
输入输出描述
输入两行字符串,分别为s1和s2,s2的长度小于等于s1
输出s2在s1中出现的次数

s1 = str(input())
s2 = str(input())
sount = 0
a = ""

for i in s1 :
    for j in s2 :
        if i == j :
            a = s1[(i - 1)] + i + s1[(i + 1)]
            if a == s2 :
                sount += 1
print(sount)

Demo55 检测密码

题目描述
一些网站会给密码强加一些规则:
(1)密码必须至少有8个字符
(2)密码只能包含英文字母和数字
(3)密码应该至少包含两个数字
(4)密码应该至少包含两个大写字母
如果密码符合规则,输出Yes;否则输出No
输入输出描述
输入一串密码
输出该密码是否符合规则

pw = str(input())
lenth = True
text = True
menber = True
word = True
big = 0
num = 0

if len(pw) >= 8 :
    lenth = True
else :
    lenth = False

for i in pw :
    if chr(65) <= ord(i) <= chr(90) or chr(97) <= ord(i)  <= chr(122) or chr(48) <= ord(i)  <= chr(57) :
        text = True
    else :
        text =  False

for j in pw :
    if chr(48) <= ord(j) <= chr(57) :
        num += 1
        if num >= 2 :
            menber = True
        else :
            menber = False

for k in pw :
    if chr(65) <= ord(k) <= chr(90) :
        big += 1 
        if big >= 2 :
            word = True
        else : 
            word = False

if lenth and text and menber and word :
    print("Yes")
else :
    print("No")

Demo56 回文素数

题目描述
回文素数是指一个数既是素数又是回文数,例如131既是素数也是回文数
输出显示前100个回文素数,每行显示10个

def is_prime(n : int) :
    if n < 2 :
        return False
    for i in range(2 , n // 2 + 1):
        if n % i == 0 :
            return False
        else:
            return True        

def is_huiwen(n : int):
    if str(n) == str(n)[::-1]:
        return True

count = 0
n = 2
while count < 100 :
    if is_prime(n) and is_huiwen(n) :
        print("%5d" %n , end=" ")
        count += 1

        if count % 10 == 0 :
            print()
    n += 1

Demo57 反素数

题目描述
反素数是指一个将其逆向拼写后也是一个素数的非回文数,例如17和71都是素数但不是回文数,且反转后依旧是素数
输出显示前100个反素数,每行显示10个

def is_prime(n : int) :
    if n < 2 :
        return False
    for i in range(2 , n // 2 + 1):
        if n % i == 0 and str(n) == str(n)[::-1]:
            return False
        else:
            return True    
        
def is_rprime(n : int):
    m = n[::-1]
    if m < 2 :
        return False
    for i in range(2 , m // 2 + 1) and str(n) == str(n)[::-1]:
        if m % i == 0 :
            return False
        else:
            return True  

count = 0
n = 2
while count < 100 :
    if is_prime(n) and is_rprime(n) :
        print("%5d" %n , end=" ")
        count += 1

        if count % 10 == 0 :
            print()
    n += 1

Demo58 双素数

题目描述
双素数是指一对差值为2的素数,例如3和5就是一对双素数,5和7也是一对双素数
输出显示小于1000的双素数

def is_prime(n : int) :
    if n < 2 :
        return False
    for i in range(2 , n // 2 + 1):
        if n % i == 0:
            return False
        else:
            return True  

count = 0
n = 2
ls = []
while n < 1000:
    if is_prime(n) :
        ls.append(n)
    n += 1    

for i in range(len(ls)):
    if ls[i + 1] - ls[i] == 2:
        print(ls[i] , "和" , ls[i + 1] , "是一对双素数")

Demo59 梅森素数

如果一个素数可以写成 2 p − 1 2^p-1 2p1的形式,其中p是某个正整数,那么这个素数就称作梅森素数
输出p≤31的所有梅森素数

def is_prime(n : int) :
    if n < 2 :
        return False
    for i in range(2 , n // 2 + 1):
        if n % i == 0 :
            return False
        else:
            return True

n = 2
while True:
    if is_prime(n):
        for p in range(32):
                if 2 ** p - 1 == n:
                    print(n)     
    n += 1        
    while n > 2 ** 31:
        break

Demo60 平方根的近似求法

有几种实现开平方 n \sqrt{n} n 的技术,其中一个称为巴比伦法
它通过使用下面公式的反复计算近似地得到:
n e x t G u e s s = ( l a s t G u e s s + n / l a s e t G u e s s ) / 2 nextGuess=(lastGuess+n/lasetGuess)/2 nextGuess=(lastGuess+n/lasetGuess)/2
当nextGuess和lastGuess几乎相同时,nextGuess就是平方根的近似值
lastGuess初始值为1,如果nextGuess和lastGuess的差值小于一个很小的数,比如0.0001,就可以认为nextGuess是n的平方根的近似值;否则,nextGuess成为下一次计算的lastGuess,近似过程继续执行
编写代码,求解n的平方根的近似值

n = int(input("请输入根号下的值:"))
lastGuess = 1

while True:
    nextGuess = (lastGuess + (n / lastGuess)) / 2
    judge = abs(nextGuess - lastGuess)
    if judge < 0.0001 :
        print("n的平方根的近似值为:" , nextGuess)
        break
    else :
        lastGuess = nextGuess
        continue
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值