在dotcpp网站上的部分python程序训练代码

注:前面的序号为dotcpp里题目的编号

Dotcpp编程(C语言网) - 实用的编程学练平台https://www.dotcpp.com/

蓝桥杯ACM训练系统 - C语言网 (dotcpp.com)https://www.dotcpp.com/oj/problemset.php?page=2

目录

1038:[编程入门]宏定义练习之三角形面积:

1054: [编程入门]计算素数和

1039: [编程入门]宏定义之闰年判断

1017: [编程入门]完数的判断

1019: [编程入门]自由下落的距离计算

 1020: [编程入门]猴子吃桃的问题

1034: [编程入门]自定义函数之数字分离

1122: [编程进阶]-亲密数

1123: [编程入门]-列出最简真分数序列

1135: python训练-求s=a+aa+aaa+aaaa+aa...a的值

1136: python训练-求具有abcd=(ab+cd)2性质的四位数


1038:[编程入门]宏定义练习之三角形面积:

三角形面积=SQRT(S*(S-a)*(S-b)*(S-c)) 其中S=(a+b+c)/2,a、b、c为三角形的三边。 定义两个带参的宏,一个用来求area, 另一个宏用来求S。 写程序,在程序中用带实参的宏名来求面积area。

# 三角形面积
import math  # 引用math库


def triangle():
    # 分别传入a,b,c的值,并判断三条边是否可以组成三角形
    a = int(input("请输入a的值: "))
    b = int(input("请输入b的值: "))
    c = int(input("请输入c的值: "))
    while a + b < c or a + c < b or b + c < a:
        print("三条边无法构成三角形,请重新输入")
        triangle()
# 下面这三行与triangle()等同,两者取一即可
        # a = int(input("请输入a的值: "))
        # b = int(input("请输入b的值: "))
        # c = int(input("请输入c的值: "))
    else:
        print("开始进行运算:")
    s = (a + b + c) / 2
    area = math.sqrt((s * (s - a) * (s - b) * (s - c))) # 运用sqrt开平方
    print("三角形面积为:", area)


print("请输入三角形的三条边: ")
triangle()

1054: [编程入门]计算素数和

输入两个正整数m和n(m<n),求m到n之间(包括m和n)所有素数的和,要求定义并调用函数isprime(x)来判断x是否为素数(素数是除1以外只能被自身整除的自然数)。

举例一:

def isprime():
    add = []
    print("请输入两个数,将求两数之间的素数和")
    a = int(input("请输入第一个数:"))
    b = int(input("请输入第二个数:"))
    for n in range(a, b+1):
        for j in range(2, n):
            if n % j == 0:
                break    # break以后跳出本轮循环,下面循坏语句不执行,即else语句不执行
        else:
            add.append(n)
    print("这些素数为:",end=" ")
    for each in add:
        print(each,end=" ")  
# end =  " " 语句是不换行,以【空格】作分隔,同样里面可以写其他分隔符
    print("他们的和为:",sum(add))


isprime()

举例2:

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


def calculate_prime_sum(a, b):
    primes = [num for num in range(a, b + 1) if is_prime(num)]
    prime_sum = sum(primes)
    print(f"这些素数为:{primes},他们的和为:{prime_sum}")

1039: [编程入门]宏定义之闰年判断

给年份year,定义一个宏,以判别该年份是否闰年。提示:宏名可以定义为LEAP_YEAR,形参为y,既定义宏的形式为 #define LEAP_YEAR(y) (读者设计的字符串)

Tip:下面这个是升级题目后,打印出一定范围内的闰年,以列表形式输出,并输出有几个闰年

def judge_leap_year(n):
    if n % 100 != 0 and (n % 4 == 0 or n % 400 ==0):
        return True
    else:
        return False


def find_all_leap_year():
    list = []
    a = int(input("请输入起始年份:"))
    b = int(input("请输入终止年份:"))
    for i in range(a, b+1):
        if judge_leap_year(i):
            list.append(i)
    print("其中的闰年为:", list)
    print(f"共{len(list)}个闰年")


print("这是一个查找闰年的函数,程序开始运行")
find_all_leap_year()

1017: [编程入门]完数的判断

一个数如果恰好等于不包含它本身所有因子之和,这个数就称为"完数"。 例如,6的因子为1、2、3,而6=1+2+3,因此6是"完数"。 编程序找出N之内的所有完数,并按下面格式输出其因子

def judge_perfect_number(n):
    yinzi = []
    for m in range(1, n):
        if n % m == 0:
            yinzi.append(m)
    if n == sum(yinzi):
        return n
    else:
        return False


def give_math():
    wanshu = []
    a = int(input("请输入起始查找数字: "))
    b = int(input("请输入终止查找数字: "))
    for i in range(a, b+1):
        # 调用 judge_perfect_number() 一次,并将结果存储到变量中
        is_perfect = judge_perfect_number(i)
        if is_perfect:
            wanshu.append(is_perfect)
    print("这些完数是:", wanshu)


give_math()

运行结果如下: 

请输入起始查找数字: 0
请输入终止查找数字: 100
这些完数是: [6, 28]

进程已结束,退出代码0

1019: [编程入门]自由下落的距离计算

 一球从M米高度自由下落,每次落地后返回原高度的一半,再落下。 它在第N次落地时反弹多高?共经过多少米? 保留两位小数

def high(h, n):
    m, account_half_high = 0, [h]
    half_high = h
    while m < n:
        half_high = 1/2 * half_high  # 落地返回原高度的一半
        if m < n - 1:                # 不记设定的最后一次反弹的上升与下降距离
            double_half_high = half_high * 2  # 上升与下落的过程是两倍反弹距离
            account_half_high.append(double_half_high)
        m += 1
    res = sum(account_half_high)  # 添加变量res储存sum运算的结果
    print("第n次反弹的距离为: ", half_high)
    print("总反弹距离为:{:.2f} ".format(res))     # 保留两位小数  


def give_high():
    a = int(input("请输入下落总高度:"))
    b = int(input("请输入求第几次回弹的距离:"))
    high(a, b)


give_high()

 1020: [编程入门]猴子吃桃的问题

猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个。 第二天早上又将剩下的桃子吃掉一半,又多吃一个。以后每天早上都吃了前一天剩下的一半零一个。 到第N天早上想再吃时,见只剩下一个桃子了。求第一天共摘多少桃子。

这道题是一个典型的逆向思维题,我们可以采用逆推的方法进行求解,具体思路如下:

  1. 假设第N天早上还剩下1个桃子,那么根据题目条件可知,第N天早上吃之前的剩余桃子数量为1

  2. 根据题目,第N-1天早上剩下的桃子数量为第N天早上剩余桃子的2倍加1,即2*(1+1) = 4

  3. 注意到第N-1天早上吃之前的剩余桃子数量也需要满足上面的条件,即为第N天早上吃之前的剩余桃子数量的2倍加1;

  4. 采用迭代的方式,一步步向前推,直到第1天早上为止,设第一天早上共有x个桃子;

  5. 最后输出第一天早上的桃子数量x即可

  6. 代码如下:

def peach(n):
    if n == 1:
        return 1
    else:
        return 2 * (peach(n - 1) + 1)


N = int(input('请输入天数:'))
print('第1天共摘了', peach(N), '个桃子。')

1034: [编程入门]自定义函数之数字分离

写一函数,输入一个四位数字,要求输出这四个数字字符,但每两个数字间空格。如输入1990,应输出"1 9 9 0"。

def myfunc():
    mylist = list(input("请输入四位数:"))  # 1990
    """
    通过 input 函数获取用户输入时,获取到的是一个字符串类型的数据。
    而在 Python 中,字符串类型的数据是一个字符序列,其中的每个字符都可以作为一个元素进行访问。
    """
    print(mylist)   # ['1', '9', '9', '0']
    for each in mylist:
        print(each, end=" ")  # 1 9 9 0


myfunc()

补充说明:如果想要直接将四位数中的四个数字分别存入列表,需要在 input 函数外部调用 int 函数进行类型转换,例如:

num = int(input("请输入四位数:"))
mylist = [int(i) for i in str(num)]
print(mylist)

这样,输入 1234 时就可以将 1、2、3、4 四位数字分别存入列表 [1, 2, 3, 4] 中,便于后续的操作。

1122: [编程进阶]-亲密数

两个不同的自然数A和B,如果整数A的全部因子(包括1,不包括A本身)之和等于B;且整数B的全部因子(包括1,不包括B本身)之和等于A,则将整数A和B称为亲密数。求3000以内的全部亲密数。

输入格式:无

输出格式:

3000以内的全部亲密数(输出格式:(A,B),不加换行,不加分隔符号)
一对亲密数只输出一次, 小的在前

for i in range(1,3000):
    s = k = 0  # 赋亲密数初始值都为0
    # 计算 i 的真因数和
    for j in range(1,i):
        if i % j == 0:
            s += j
    # 计算 s 的真因数和
    """ 
    亲密数定义是a的真因子和 == b and b的真因子和 == a 。
    i为a,那么b最大s了,即b<=s,所以在s以内找b的算法比在3000内找寻,优化太多了。
    """
    for x in range(1, s):
        if s % x == 0:
            k += x
    if i == k and i < s:
        # 输出亲密数
        print("({:d},{:d})".format(i, s), end="")  # {:b}代表以整型输出,format是格式化字符串

1123: [编程入门]-列出最简真分数序列

按递增顺序依次列出所有分母为40,分子小于40的最简分数。

输入格式:无

输出格式:分数之间用逗号分开(含最末逗号)

# 计算最简分数
count = 0  # 用于计算最后有多少个最简分数
for a in range(1, 41):
    for i in range(2, a+1):  # 从2开始,被1整除余0,程序无法达成目的;a+1是为了排除自身就是两数的公因子
        if a % i == 0 and 40 % i == 0:
            break    # 跳出本次内部循环,执行下一次外部与内部循环
    else:
        count += 1
        print(a, "/", 40, end=",")
print("共{}个".format(count))    # 格式化字符串,另一种同样格式化字符串的输出方式: print(f"共{count}个")

1135: python训练-求s=a+aa+aaa+aaaa+aa...a的值

求s=a+aa+aaa+aaaa+aa...a的值,其中a是一个一位的整数。 
例如2+22+222+2222+22222(此时共有5个数相加)

输入格式:整数a和n(n个数相加,1<= n, a<=9)

输出格式:s的值

这是我最初的思路,略显复杂,但是也应该通俗易懂 

import functools


def myfunc(a: str, b: int):
    my_list = []
    while b > 0:
        c = a * b
        my_list.append(int(c))
        b -= 1
    add = functools.reduce(lambda x, y: x + y, my_list)
    print("他们的和为:", add)


print("这是一个进阶的加法程序")
m, n = input("请输入要相加的整数m: "), int(input("请输入最后一位是几位数的n: "))
myfunc(m, n)

这里面多种函数用法会让人眼花缭乱,但没有关系,以下讲解部分知识点:

1.input函数输入的数据是字符串类型,而我就是想要其是字符串类型。因为我想到的第一解决方法是通过字符串的连续拷贝来达成“22”,“222”,“2222”之类的字符串(a*b),最后用int(c)转化为整数

2.lambda表达式是比较简单的一种替代函数,可以只需要一行便执行同样的操作,如:

def myfunc(x, y):
    return x + y


c = myfunc(x,y)
print(c)

 替换为:

c = lambda x, y: x + y
print(c)

 最后这是网站大神给出的方案,简洁高效 

a, n = map(int, input().split()) 
s = b = a
for i in range(1, n):
    a = a * 10 + b
    s += a
print(s)

借助input函数输入两个数字,中间用空格隔开的字符串,split则根据空格进行分离字符串,int转化为整数类型

关于map函数的用法可参照该位博主给出的文章,希望有所帮助详解 Python Map 函数_pythontip的博客-CSDN博客让天下木有难学的Python!如果你正在学习编程,那么掌握 Python map 函数是升级打怪python的机会。想象一下:你想成为一个高级的程序员(别名:划水摸鱼工程师),希望代码编译得更快,且代码优雅简洁让同事膜拜。那么你来对地方了!在我们继续之前,你需要了解什么是函数和可迭代对象:函数是执行特定任务的代码。例如:len(), print(), str() 都是python内置函数。可迭代对象是包含一个或多个项的对象。例如:列表list、字典dict、元组tuplePython .._python maphttps://blog.csdn.net/pythontip/article/details/124470744

1136: python训练-求具有abcd=(ab+cd)2性质的四位数

3025这个数具有一种独特的性质:将它平分为二段,即30和25,使之相加后求平方,即(30+25)2,恰好等于3025本身。请求出具有这样性质的全部四位数

输入格式:无

输出格式满足题意的数全部四位数(从小到大输出,且数之间用空格分开)

for num in range(1000, 10000):
    num_str = str(num)  # 将整数转换为字符串
    num1, num2 = int(num_str[:2]), int(num_str[2:])  # 取出前两位和后两位,并将其转换为整数
    if num == pow((num1 + num2), 2):
        print(num, end=" ")

1035: [编程进阶]自定义函数之字符类型统计

题目描述:编写一函数,由实参传来一个字符串,统计此字符串中字母、数字、空格和其它字符的个数,在主函数中输入字符串以及输出上述结果。 只要结果,别输出什么提示信息。

输入格式:一行字符串

输出格式:统计数据,4个数字,空格分开。 

import string


def my_str():
    # 初始化各种字符的数量为0
    letter_counts, count_counts, blank_space_counts, other_counts = 0, 0, 0, 0
    # 将数字和空格字符分别加入两个列表中
    count_list = list(string.digits)  # 数字列表
    blank_space_list = list(string.whitespace)  # 空格列表
    # 将所有字母加入一个列表中
    letter_list = list(string.ascii_letters)  # 字母列表
    # 从控制台读取用户输入的字符串
    mystr = input("请输入一串字符串:")
    # 遍历字符串中的每个字符
    for each in mystr:
        # 判断字符类型并累计计数
        if each in letter_list:
            letter_counts += 1
        elif each in count_list:
            count_counts += 1
        elif each in blank_space_list:
            blank_space_counts += 1
        else:
            other_counts += 1

    # 输出字母、数字、空格和其他字符各自的数量
    print(f"字母有{letter_counts}个")
    print(f"数字有{count_counts}个")
    print(f"空格有{blank_space_counts}个")
    print(f"其他字符有{other_counts}个")


my_str()

 1144: C语言训练-自守数问题

 

# 自守数
for math in range(0, 200001):
    square_math = math ** 2
    if str(square_math)[-len(str(math)):] == str(math):
        print(math, end="  ")

1140: C语言训练-求车速

def myfunc(count):
    count += 1
    if str(count)[:] == str(count)[::-1]:
        print("新的里程数为:", count)
        print("该车的速度是{}公里/小时".format((count - 95859)/2))
    else:
        myfunc(count)


myfunc(95859)

1147: python训练-角谷猜想

def myfunc(n):
    while n != 1:
        if n % 2 == 0:     # 判断是否是偶数
            print(f"{n}/2={n//2}")
            n //= 2
        elif n % 2 == 1:   # 判断是否是奇数
            print(f"{n}*3+1={n*3+1}")
            n = n*3+1


myfunc(10)

 1159: 偶数求和

def average_sequence(n, m):
    sequence = [2 + 2 * i for i in range(n)]  # 构建初始数列
    averages = []  # 用于存储平均值序列

    for i in range(0, n, m):
        sub_sequence = sequence[i:i + m]  # 取出每个子数列

        average = sum(sub_sequence) / len(sub_sequence)  # 计算子数列的平均值
        averages.append(average)  # 将平均值添加到结果序列

    return averages


# 测试
result = average_sequence(4,2)
print("平均值序列:", result)

1162: 密码

import string


def safe_secret(secret):
    special_chars = string.punctuation  # 特殊字符集合
    secret_type = 0
    categories = [0, 0, 0, 0]  # 分别记录大写字母、小写字母、数字和特殊字符的出现情况

    if len(secret) < 8 or len(secret) > 16:
        return "密码长度小于8位或大于16位"
    else:
        for i in secret:
            if i.isupper():
                categories[0] = 1
            elif i.islower():
                categories[1] = 1
            elif i.isdigit():
                categories[2] = 1
            elif i in special_chars:
                categories[3] = 1

    secret_type = sum(categories[:4])  # 计算满足条件的个数

    if secret_type >= 3:
        return "合格的密码"
    else:
        return "密码不符合要求"


def circulate(n, secret_list=[]):  # 将 secret_list 设置为可变参数,默认为空列表
    if n == 0:
        for secret in secret_list:
            reply = safe_secret(secret)
            print(reply)
    else:
        secret = input("请输入密码: ")
        secret_list.append(secret)
        circulate(n - 1, secret_list)  # 将更新后的 secret_list 传递给递归调用


n = int(input("请输入 n: "))
circulate(n)

   但我会更喜欢这样的代码,能够用户每输入一次密码就判断是否符合要求,更加人性化

import string


def safe_secret(secret):
    special_chars = string.punctuation  # 特殊字符集合
    categories = [0, 0, 0, 0]  # 分别记录大写字母、小写字母、数字和特殊字符的出现情况

    if len(secret) < 8 or len(secret) > 16:
        return "密码长度小于8位或大于16位"
    else:
        for i in secret:
            if i.isupper():
                categories[0] = 1
            elif i.islower():
                categories[1] = 1
            elif i.isdigit():
                categories[2] = 1
            elif i in special_chars:
                categories[3] = 1

    secret_type = sum(categories[:4])  # 计算满足条件的个数

    if secret_type >= 3:
        return "合格的密码"
    else:
        return "密码不符合要求"


def circulate(n):
    if n == 0:
        print("判断完毕")
    else:
        secret = input("请输入密码: ")
        reply = safe_secret(secret)
        print(reply)
        circulate(n-1)


n = int(input("请输入 n: "))
circulate(n)

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

One>twenty

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值