注:前面的序号为dotcpp里题目的编号
Dotcpp编程(C语言网) - 实用的编程学练平台https://www.dotcpp.com/
蓝桥杯ACM训练系统 - C语言网 (dotcpp.com)https://www.dotcpp.com/oj/problemset.php?page=2
目录
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天早上想再吃时,见只剩下一个桃子了。求第一天共摘多少桃子。
这道题是一个典型的逆向思维题,我们可以采用逆推的方法进行求解,具体思路如下:
假设第N天早上还剩下1个桃子,那么根据题目条件可知,第N天早上吃之前的剩余桃子数量为
1
;根据题目,第N-1天早上剩下的桃子数量为第N天早上剩余桃子的2倍加1,即
2*(1+1) = 4
;注意到第N-1天早上吃之前的剩余桃子数量也需要满足上面的条件,即为第N天早上吃之前的剩余桃子数量的2倍加1;
采用迭代的方式,一步步向前推,直到第1天早上为止,设第一天早上共有x个桃子;
最后输出第一天早上的桃子数量x即可
代码如下:
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转化为整数类型
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)