python练习题2

34.Demo34 最大公约数

题目描述

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

输入输出描述

输入两个数字

输出最大公约数

def gcd(a, b):
    while b:
        a, b = b, a % b
    return a

num1, num2 = map(int, input().split())
result = gcd(num1, num2)
print(result)

35.Demo35 判断素数

题目描述

一个大于1的整数如果只能被正整数1和它本身整除,则它就是素数,例如2、3、5和7都是素数,而4、6、8、9则不是

输入输出描述

输入一个大于1的正整数

输出Yes表示该数字是素数,否则输出No

def is_prime(num):
    if num <= 1:
        return False
    for i in range(2, int(num**0.5) + 1):
        if num % i == 0:
            return False
    return True

number = int(input("请输入一个大于1的正整数: "))
if is_prime(number):
    print("Yes")
else:
    print("No")

36.Demo36 最小公倍数

题目描述

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

输入输出描述

输入两个正整数

输出最小公倍数

def lcm(a, b):
    def gcd(x, y):
        while y:
            x, y = y, x % y
        return x

    return a * b // gcd(a, b)

num1, num2 = map(int, input().split())
result = lcm(num1, num2)
print(result)

37.Demo37 整数的素因子

题目描述

输入一个正整数,然后找出它所有的最小因子,也称之为素因子

输入输出描述

输入一个正整数

输出多行,每行输出一个素因子

def find_smallest_prime_factors(num):
    factors = []
    divisor = 2
    while divisor * divisor <= num:
        if num % divisor == 0:
            factors.append(divisor)
            num //= divisor
        else:
            divisor += 1
    if num > 1:
        factors.append(num)
    return factors

number = int(input("请输入一个正整数: "))
result = find_smallest_prime_factors(number)
for factor in result:
    print(factor)

38.Demo38 完全数

题目描述

如果一个正整数等于除了它本身之外所有正因子的和,那么这个数称为完全数

例如 6 = 3 + 2 + 1,28 = 14 + 7 + 4 + 2 + 1

输入输出描述

输入一个正整数

输出该数是否为完全数

def is_perfect_number(num):
    if num <= 1:
        return False
    divisors_sum = 1
    for i in range(2, int(num**0.5) + 1):
        if num % i == 0:
            divisors_sum += i
            if i != num // i:
                divisors_sum += num // i
    return divisors_sum == num

number = int(input("请输入一个正整数: "))
if is_perfect_number(number):
    print("Yes")
else:
    print("No")

39.Demo39 前50个素数

题目描述

打印前50个素数,每打印10个素数换行

def is_prime(num):
    if num <= 1:
        return False
    for i in range(2, int(num**0.5) + 1):
        if num % i == 0:
            return False
    return True

count = 0
num = 2
while count < 50:
    if is_prime(num):
        print(num, end=" ")
        count += 1
        if count % 10 == 0:
            print()
    num += 1

40.Demo40 计算π

题目描述

你可以使用下面的数列近似计算π

π=4(1-\frac{1}{3}+\frac{1}{5}-\frac{1}{7}+\frac{1}{9}-\frac{1}{11}+...+\frac{(-1)^{i+1}}{2i-1})

当i越大时,计算结果越近似于π

def approximate_pi(iterations):
    pi_approx = 0
    sign = 1
    for i in range(1, iterations+1):
        pi_approx += sign * (1 / (2*i - 1))
        sign *= -1
    return 4 * pi_approx

result = approximate_pi(1000000)
print(result)

41.Demo41 计算e

题目描述

你可以使用下面的数列近似计算e

e=1+\frac{1}{1!}+\frac{1}{2!}+\frac{1}{3!}+\frac{1}{4!}+...+\frac{1}{i!}

当i越大时,计算结果越近似于e

def approximate_e(n):
    e_approx = 1
    factorial = 1
    for i in range(1, n):
        factorial *= i
        e_approx += 1 / factorial
    return e_approx

n = 10  # Choose the number of terms to use in the approximation
approx_e = approximate_e(n)
print("Approximation of e:", approx_e)

43.Demo43 组合问题I

题目描述

在数字范围[1,7]之间,任意选择两个不相同的数作为一个组合,输出每一组组合,并统计所有组合的个数

注:组合(a,b)与组合(b,a)算同一种组合,只记录一次

count = 0
for i in range(1, 7):
    for j in range(i+1, 8):
        print(f"组合({i}, {j})")
        count += 1

print("总共的组合个数为:", count)

44.Demo44 组合问题II

题目描述

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

count = 0
for i in range(1, 5):
    for j in range(1, 5):
        for k in range(1, 5):
            if i != j and j != k and i != k:
                print(f"{i}{j}{k}")
                count += 1

print("总共的符合要求的三位数个数为:", count)

47.Demo47 堆叠相加

题目描述

现有堆叠相加模式$a+aa+aaa+aaaa+aaaaa+......$

例如:$2+22+222+2222+22222$,其中a为2,且有5组数字

输入输出描述

输入两个数据分别为数字a和组数n

输出按照堆叠相加模式算出的和

def stack_addition(a, n):
    result = 0
    current_term = a
    for _ in range(n):
        result += current_term
        current_term = current_term * 10 + a
    return result

a = 2
n = 5
total = stack_addition(a, n)
print("堆叠相加结果:", total)

48.Demo48 十进制转二进制

题目描述

输入一个十进制正整数,输出其二进制形式

输入输出描述

输入一个十进制正整数

输出二进制字符串

decimal_number = int(input("请输入一个十进制正整数:"))
binary_number = bin(decimal_number)[2:]
print(binary_number)

52.Demo52 最长公共前缀

题目描述

给定两个字符串 s1 和 s2 ,求两个字符串最长的公共前缀串,字符区分大小写

输入输出描述

输入两行,分别表示s1和s2

输出前缀串、

s1 = input("请输入字符串 s1:")
s2 = input("请输入字符串 s2:")
common_prefix = ""
for i in range(min(len(s1), len(s2))):
    if s1[i] == s2[i]:
        common_prefix += s1[i]
    else:
        break
print(common_prefix)

53.Demo53 子串出现的次数

题目描述

给定两个字符串 s1 和 s2 ,求 s2 在 s1 中出现的次数,字符区分大小写,已匹配的字符不计入下一次匹配

输入输出描述

输入两行字符串,分别为s1和s2,s2的长度小于等于s1

输出s2在s1中出现的次数

s1 = input("请输入字符串 s1:")
s2 = input("请输入字符串 s2:")
count = 0
start = 0
while True:
    index = s1.find(s2, start)
    if index == -1:
        break
    count += 1
    start = index + 1
print(count)

54.Demo54 最长公共子串

题目描述

给定两个字符串 s1 和 s2 ,求 s1 与 s2 之间的最长公共子串,字符区分大小写

输入输出描述

输入两行字符串,分别为s1和s2

输出最长公共子串

s1 = input("请输入字符串 s1:")
s2 = input("请输入字符串 s2:")
def longest_common_substring(s1, s2):
    m = len(s1)
    n = len(s2)
    dp = [[0] * (n + 1) for _ in range(m + 1)]
    max_length = 0
    end_index = 0
    for i in range(1, m + 1):
        for j in range(1, n + 1):
            if s1[i - 1] == s2[j - 1]:
                dp[i][j] = dp[i - 1][j - 1] + 1
                if dp[i][j] > max_length:
                    max_length = dp[i][j]
                    end_index = i
            else:
                dp[i][j] = 0
    return s1[end_index - max_length:end_index]

print(longest_common_substring(s1, s2))

55.Demo55 检测密码

题目描述

一些网站会给密码强加一些规则:

(1)密码必须至少有8个字符

(2)密码只能包含英文字母和数字

(3)密码应该至少包含两个数字

(4)密码应该至少包含两个大写字母

如果密码符合规则,输出Yes;否则输出No

输入输出描述

输入一串密码

输出该密码是否符合规则

import re

password = input("请输入密码:")

if (len(password) >= 8 and
    re.match("^(?=.*[A-Z].*[A-Z])(?=.*[0-9].*[0-9])([A-Za-z0-9]+)$", password)):
    print("Yes")
else:
    print("No")

56.Demo56 回文素数

题目描述

回文素数是指一个数既是素数又是回文数,例如131既是素数也是回文数

输出显示前100个回文素数,每行显示10个

def is_prime(num):
    if num < 2:
        return False
    for i in range(2, int(num**0.5) + 1):
        if num % i == 0:
            return False
    return True

def is_palindrome(num):
    return str(num) == str(num)[::-1]

count = 0
num = 2
while count < 100:
    if is_prime(num) and is_palindrome(num):
        print(num, end=" ")
        count += 1
        if count % 10 == 0:
            print()
    num += 1

57.Demo57 反素数

题目描述

反素数是指一个将其逆向拼写后也是一个素数的非回文数,例如17和71都是素数但不是回文数,且反转后依旧是素数

输出显示前100个反素数,每行显示10个

def is_prime(num):
    if num < 2:
        return False
    for i in range(2, int(num**0.5) + 1):
        if num % i == 0:
            return False
    return True

def is_reverse_prime(num):
    reverse_num = int(str(num)[::-1])
    return is_prime(num) and is_prime(reverse_num) and num != reverse_num

count = 0
num = 2
while count < 100:
    if is_reverse_prime(num):
        print(num, end=" ")
        count += 1
        if count % 10 == 0:
            print()
    num += 1

58.Demo58 双素数

题目描述

双素数是指一对差值为2的素数,例如3和5就是一对双素数,5和7也是一对双素数

输出显示小于1000的双素数

def is_prime(num):
    if num < 2:
        return False
    for i in range(2, int(num**0.5) + 1):
        if num % i == 0:
            return False
    return True

for num in range(3, 1000):
    if is_prime(num) and is_prime(num + 2):
        print(f"{num}和{num+2}是一对双素数")

59.Demo59 梅森素数

如果一个素数可以写成$2^p-1$的形式,其中p是某个正整数,那么这个素数就称作梅森素数

输出p≤31的所有梅森素数

def is_prime(num):
    if num < 2:
        return False
    for i in range(2, int(num**0.5) + 1):
        if num % i == 0:
            return False
    return True

for p in range(1, 32):
    candidate = 2**p - 1
    if is_prime(candidate):
        print(f"p={p}时,梅森素数为:{candidate}")

60.Demo60 平方根的近似求法

有几种实现开平方$\sqrt{n}$的技术,其中一个称为巴比伦法

它通过使用下面公式的反复计算近似地得到:

当nextGuess和lastGuess几乎相同时,nextGuess就是平方根的近似值

lastGuess初始值为1,如果nextGuess和lastGuess的差值小于一个很小的数,比如0.0001,就可以认为nextGuess是n的平方根的近似值;否则,nextGuess成为下一次计算的lastGuess,近似过程继续执行

编写代码,求解n的平方根的近似值

def sqrt_by_babylonian_method(n):
    last_guess = 1
    next_guess = (last_guess + n / last_guess) / 2
    while abs(next_guess - last_guess) >= 0.0001:
        last_guess = next_guess
        next_guess = (last_guess + n / last_guess) / 2
    return next_guess

n = float(input("请输入一个数:"))
result = sqrt_by_babylonian_method(n)
print(f"巴比伦法求得的{n}的平方根近似值为:{result:.4f}")

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值