首页 分享 经典编程挑战与解决方案

经典编程挑战与解决方案

来源:花匠小妙招 时间:2024-12-19 08:07

1、一个数如果恰好等于它的因子之和,这个数就称为“完数”,例如, 6 的因子
为 1、 2、 3,而 6=1+2+3,因此 6 是“完数”。编程序找出 1000 之内的所有完数,

并按下面的格式输出其因子:
6 its factors are 1, 2, 3
参考代码:

for i in range(1,1001):s = 0 for j in range(i): if j==0: continue if i%j==0: s=s+j if s==i: print('{} its factors are '.format(i),end='') for j in range(i): if j == 0: continue if i % j == 0: print(j,end=' ') print('n') 123456789101112

2、打印出所有的“水仙花数”,所谓“水仙花数”是指一个 3 位数,其各位数字立方和等于该数本身。例如, 153 是一个水仙花数,因为 153=13+53+33
参考代码:

for i in range(1,1001):s = 0 for j in range(i): if j==0: continue if i%j==0: s=s+j if s==i: print('{} its factors are '.format(i),end='') for j in range(i): if j == 0: continue if i % j == 0: print(j,end=' ') print('n') 123456789101112

3、返回文档中英文单词数(注意:文件与程序在同一目录下)
参考代码

import re #统计单词个数: def count_words(file_path): with open(file_path) as file: text = file.read() words = re.findall(r'[a-zA-Z]+', text) count = len(words) return count print(count_words('hamlet.txt')) 123456789

4、绘制一个红色的五角星图形
参考代码:

import turtle as tk tk.fillcolor("red") tk.begin_fill() while True: tk.forward(200) tk.right(144) if abs(tk.pos()) < 1: break tk.end_fill() import turtle as t t.pencolor('red') t.fillcolor('red') t.begin_fill() for i in range(5): t.fd(200) t.rt(144) t.end_fill()

12345678910111213141516171819

5、螺旋线绘制(每一圈是四个线段组成,一共绘制100个线段)
参考代码:

import turtle import time turtle.pensize(1) for x in range(100): turtle.forward(x) turtle.left(90) time.sleep(100) 1234567

6、猜大小:生成一个1~100之间的随机整数, 然后输入一个数字来猜,如果大于,则打印“ 大了”,小于,则打印“小了”,如果相等,则打印“猜中了,共猜了3次”(如果三次猜中的话) ,如果5次机会用完成都没有请个猜中,则输出“你的机会用完,随机数是51”(假设此次随机数51)

import random a=random.randint(1,100) print ("随机数是: %d"%a) i=0 while i<5: b=eval(input("please input a number:")) if b>a: print("大了") elif b<a: print("小了") elif b==a: print ("猜中了,共用了%d次"%(i+1)) break i=i+1 if i==5:print ("随机数是: %d"%a)

1234567891011121314151617

7、输出指定范围内的所有素数
参考代码:

from math import sqrt lower = int(input("输入区间最小值: ")) upper = int(input("输入区间最大值: ")) num=[]; for i in range(lower,upper+1): if i>1: j=2 for j in range(2,int(sqrt(i+1))): if(i%j==0): break else: num.append(i) print(num) 1234567891011121314

8、冒泡排序:冒泡排序(Bubble Sort)是一种简单的排序算法。它重复地遍历要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。遍历数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端。
参考代码:

def bubble_sort(list): n = len(list) for i in range(n - 1): for j in range(0, n - 1 - i): if list[j] > list[j + 1]: list[j], list[j + 1] = list[j + 1], list[j] 123456

9、编写程序,判断今天是今年的第几天

import time date=time.localtime()#获取本地的当前日期 year,month,day=date[:3] day_month=[31,28,31,30,31,30,31,31,30,31,30,31] if year%400==0 or year%4==0 and year%100!=0 : day_month[1]=29 if month==1: print(day) else: print(sum(day_month[:month-1])+day) 1234567891011

10、斐波纳契数列:查找斐波纳契数列中第 N 个数。
所谓的斐波纳契数列是指:
前2个数是 1 和 1 。
第 i 个数是第 i-1 个数和第i-2 个数的和。
斐波纳契数列的前10个数字是:

1, 1, 2, 3, 5, 8, 13, 21, 34,55 …
参考代码:

i = 0 a,b =1, 1 n=eval(input("要查询斐波那契数列的第几个数?")) while i < n-1: a,b =b,a+b i +=1 print(a) 1234567

11、判断字符串是否没有重复字符
例如:
给出"abc",返回 “没有”
给出"aab",返回 “有”
参考代码:

str=input("请输入一个字符串:") results = [] new_results = [] for i in str: results.append(i) for i in str: if i not in new_results: new_results.append(i) if results==new_results: print("没有") else:print("有") 123456789101112

12、约瑟夫环问题:已知n个人(以编号1,2,3…n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到k的那个人被杀掉;他的下一个人又从1开始报数,数到k的那个人又被杀掉;依此规律重复下去,直到圆桌周围的人只剩最后一个。
参考代码:

n=eval(input("输入总人数:")) k=eval(input("输入退出时报的数:")) if k==1:print('survive:',n) else:p=0people=list(range(1,n+1))while True:if len(people)==1:breakp=(p+(k-1))%len(people)print('kill:',people[p])del people[p]print('survive:',people[0]) 1234567891011121314

13、寻找四位黑洞数:
黑洞数是指这样的整数:由这个数字每位上的数字组成的最大数减去每位数字组成的最小数仍然得到这个数自身。例如3位黑洞数是495,因为954-459=495,4位数字是6174,因为7641-1467=6174。

参考代码:

from functools import reduce for i in range(100,1000): a=[int(c) for c in str(i)] sort() #a变为正序 #将它的逆序切片用reduce函数作乘10+y得intmax s1 = reduce(lambda x, y: 10 * x + y, a[::-1]) #将它本身(正序序列)用reduce函数作乘10+y得intmin s2 = reduce(lambda x, y: 10 * x + y, a) if(s1-s2==i): print(i) 1234567891011

14、用Python集合求解啤酒问题(携程2016笔试题)
问题描述:一位酒商共有5桶葡萄酒和1桶啤酒,6个桶的容量分别为30升、32升、36升、38升、40升和62升,并且只卖整桶酒,不零卖。第一位顾客买走了2整桶葡萄酒,第二位顾客买走的葡萄酒是第一位顾客的2倍。那么,本来有多少升啤酒呢?

参考代码:

back=[30,32,36,38,40,62] def ProSolve(back): total=sum(back) for pijiu in back: putao2,yushu=divmod(total-pijiu,3) if yushu==0: #说明这五个若是葡萄酒可满足被三整除的条件 for i in back: j=putao2-i if j!=i and (j in back) and j!=pijiu and i!=pijiu: #说明在这五个中存在两个i,j可以构成1/3的总葡萄 return pijiu return "no answer" #如果没有返回no answer print("啤酒为",ProSolve(back)) 1234567891011121314

(参考思路:首先将题目给的序列打表放入list类型的back中,用sum求了其和,首先循环尝试哪个桶符合啤酒的要求,因为客户买了两桶葡萄酒,又买了剩下的一些葡萄酒是这两桶的两倍(从数字特征中能看出一定又买了三桶),所以加起来是3的倍数,因此要求减去啤酒桶后,剩下的葡萄酒一定是可以被3整除的。这里用了divmod()方法,该方法将第一参数除以第二参数,返回(商,余数)的tuple。如果余数是0,继续向下判断,这里的商就要求是两个桶的和,如果能找出两个不同的桶且和啤酒也不同的桶符合两个桶加起来正好是那个商(putao2),剩下的三个桶自然地符合题目的要求,这时就可以输出啤酒是哪个了。将问题写在ProSolve()函数体内,而没有直接输出是为了避免在最小的for循环中会输出两次(i和j对调时会再符合一次要求),而没能及时退出程序。)
15、删除列表中的重复元素
随机生成一个列表,将其中重复的元素删除

参考代码:
#第二种方式

l=[1,1,6,3,1,5,2] def duplictae(lists): L=[] for i in lists: if i not in L: L.append(i) return L print(duplictae(l)) 12345678

16、计算传入字符串中“数字”、“字母”、“空格”以及“其他”的个数

str=input("输入一个字符串:") res = { 'num': 0, 'string': 0, 'space': 0, 'other': 0, } for s in str: if s.isdigit(): #判断属于数字 res['num'] += 1 elif s.isalpha(): #判断属于字符串 res['string'] += 1 elif s.isspace(): #判断属于空格 res['space'] += 1 else: res['other'] += 1 print(res)

123456789101112131415161718

17、求中位数
中位数是一个可将数值集合划分为相等的上下两部分的一个数值。如果列表数据的个数是奇数,则列表中间那个数据就是列表数据的中位数;如果列表数据的个数是偶数,则列表中间那2个数据的算术平均值就是列表数据的中位数。

参考代码:

data=[1,34,5,4,3,6,3,34,7,68,56,9] data.sort() half = len(data) // 2 print((data[half] + data[~half]) / 2) 1234

18、请将a字符串的数字取出,并输出成一个新的字符串。

a = 'aAsmr3idd4bgs7Dlsf9eAF' b= [s for s in a if s.isdigit()] print( ''.join([s for s in b if s.isdigit()])) 123

19、请判断 ‘boy’里出现的每一个字母,是否都出现在a字符串里。如果出现,则输出True,否则,则输 出False.
参考代码:

a = 'oAaAsmr3iddy4bgsb7Dlsf9eAF' search = 'boy' u = set(a) print( u) u.update(list(search)) ‘’’把要查找的字符串更新到a的列表中,如果存在相同顺序的字符串则返回true,否则返回False’’’ print( u) print( len(set(a)) == len(u)) 12345678910

20、输出a字符串出现频率最高的字母
参考代码:

a = 'AaAsmr3idd4bgsboy7Dlsf9eAF' l = ([(x,a.count(x)) for x in set(a)])#作为列表形式统计每个字符出现次数 l.sort(key = lambda k:k[1],reverse=True) #取出列表中每个元素的第二个键值,并使用从大到小的排序 print( l[0][0]) 12345

21、已知 a = [1,2,3,6,8,9,10,14,17],请将该list转换为字符串,例如 ‘123689101417’.
参考代码:

a = [1,2,3,6,8,9,10,14,17] b = str(a)#转换成字符串 c = str(a)[1:-1]#去除方括号 d = str(a)[1:-1].replace(', ','')#对, 进行替换空白 print (d) 12345

22、dicta = {“a”:1,“b”:2,“c”:3,“d”:4,“f”:“hello”} ,dictb = {“b”:3,“d”:5,“e”:7,“m”:9,“k”:“world”}

要求写 段代码,实现两个字典的相加,不同的key对应的值保留,相同的key对应的值相加后保留,如果是字符串就拼接,如上 例得到结果为:

dictc = {“a”:1,“b”:5,“c”:3,“d”:9,“e”:7,“m”:9,“f”:“hello”,“k”:“world”}
参考代码:

dicta={'a':1,'b':2,'c':3,'d':4,'f':'hello'} dictb={'b':3,'d':5,'e':7,'m':9,'k':'world'} dic={} for key1 in dicta: for key2 in dictb: if key1==key2: dic[key1]=dicta[key1]+dictb[key2] for a in dicta: if a not in dic: dic[a]=dicta[a] for b in dictb: if b not in dic: dic[b]=dictb[b] print(dic) 1234567891011121314

23、生成指定长度的验证码(由数字和大小写英文字母构成的随机字符串)
参考代码:

from random import randint length=eval(input("输入验证码的长度:")) code_string = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789' code = '' for _ in range(length): code += code_string[randint(0, len(code_string) - 1)] print( code) 12345678

24、设计一个函数,计算字符串中所有数字序列的和
参考代码:

import re string=input("输入一个包含数字的字符串:") nums = re.compile(r'd+') mylist = nums.findall(string) my_sum = 0 for num in mylist: my_sum += int(num) print(my_sum) 12345678

25、列表 ls 中存储了我国 39 所 985 高校所对应的学校类型,请编写代码统计输出各类型的数量。
ls = [“综合”, “理工”, “综合”, “综合”, “综合”, “综合”, “综合”, “综合”, “综合”, “综合”,
“师范”, “理工”, “综合”, “理工”, “综合”, “综合”, “综合”, “综合”, “综合”,“理工”,
“理工”, “理工”, “理工”, “师范”, “综合”, “农林”, “理工”, “综合”, “理工”, “理工”,
“理工”, “综合”, “理工”, “综合”, “综合”, “理工”, “农林”, “民族”, “军事”]
参考代码:

ls = ["综合", "理工", "综合", "综合", "综合", "综合", "综合", "综合", "综合", "综合", "师范", "理工", "综合", "理工", "综合", "综合", "综合", "综合", "综合", "理工", "理工", "理工", "理工", "师范", "综合", "农林", "理工", "综合", "理工", "理工", "理工", "综合", "理工", "综合", "综合", "理工", "农林", "民族", "军事"] d = {} for word in ls: d[word] = d.get(word, 0) + 1 for k in d: print("{}:{}".format(k, d[k])) 12345678910

26、《论语》是儒家学派的经典著作之一,主要记录了孔子及其弟子的言行。网络上有很多《论语》文本版本。这里给出了一个版本,文件名称为“论语-网络版.txt”,其内容采用如下格式组织:
【原文】
1.11子曰:“父在,观其(1)志;父没,观其行(2);三年(3)无改于父之道(4),可谓孝矣。”
【注释】
(略)
【译文】
(略)
【评析】
(略)
该版本通过【原文】标记《论语》原文内容,采用【注释】、【译文】和【评析】标记对原文的注释、译文和评析。
请编写程序,提取《论语》文档中所有原文内容,输出保存到“论语-提取版.txt”文件。输出文件格式要求:去掉文章中原文部分每行行首空格及如“1.11”等的数字标志,行尾无空格、无空行。参考格式如下(原文中括号及内部数字是对应源文件中注释项的标记):
子曰(1):“学(2)而时习(3)之,不亦说(4)乎?有朋(5)自远方来,不亦乐(6)乎?人不知(7),而不愠(8),不亦君子(9)乎?”
有子(1)曰:“其为人也孝弟(2),而好犯上者(3),鲜(4)矣;不好犯上,而好作乱者,未之有也(5)。君子务本(6),本立而道生(7)。孝弟也者,其为人之本与(8)?”
子曰:“巧言令色(1),鲜(2)仁矣。”

fi = open("论语原文及其全文翻译.txt", "r", encoding="utf-8") fo = open("论语-提取版.txt", "w") wflag = False #写标记 for line in fi.readlines(): if "【" in line: #遇到【时,说明已经到了新的区域,写标记置否 wflag = False if "【原文】" in line: #遇到【原文】时,设置写标记为True wflag = True continue if wflag == True: #根据写标记将当前行内容写入新的文件 for i in range(0,25): for j in range(0,25): line = line.replace("{}•{}".format(i,j),"**") for i in range(0,10): line = line.replace("*{}".format(i),"") for i in range(0,10): line = line.replace("{}*".format(i),"") line = line.replace("*","") fo.write(line) fi.close() fo.close() import re fi = open('论语原文及其全文翻译.txt', 'r', encoding='utf-8') fo = open('论语-提取版.txt', 'w', encoding='utf-8') wflag = False #with open('论语原文及其全文翻译.txt', 'r', encoding='utf-8')as f: for line in fi.readlines(): if "【" in line: #遇到【时,说明已经到了新的区域,写标记置否 wflag = False if "【原文】" in line: wflag = True continue if wflag == True: line = re.sub(r'd+Sd+.?|(d+)', '', line) #print(line) fo.write(line)

1234567891011121314151617181920212223242526272829303132333435363738394041

fo.close()

27、编写代码完成如下功能:
(1)建立字典 d,包含内容是:“数学”:101, “语文”:202, “英语”:203, “物理”:204, “生物”:206。
(2)向字典中添加键值对"化学":205。
(3)修改"数学"对应的值为 201。
(4)删除"生物"对应的键值对。
(5)按顺序打印字典 d 全部信息,参考格式如下(注意,其中冒号为英文冒号,逐行打印):
201:数学
202:语文
203:(略)
参考代码:

d = {"数学":101, "语文":202, "英语":203, "物理":204, "生物":206} d["化学"] = 205 d["数学"] = 201 del d["生物"] for key in d: print("{}:{}".format(d[key], key)) 123456

28、使用 turtle 库的 turtle.right() 函数和 turtle.fd() 函数绘制一个菱形四边形,边长为 200 像素,效果如下图所示。请勿修改已经给出的第一行代码,并完善程序。

参考代码:

import turtle as t t.right(-30) for i in range(2): t.fd(200) t.right(60*(i+1)) for i in range(2): t.fd(200) t.right(60*(i+1)) import turtle as t t.rt(210) for i in range(2): t.rt(120) t.fd(200) t.rt(60) t.fd(200)

1234567891011121314151617

29、使用 turtle 库的 turtle.circle() 函数、turtle.seth() 函数和 turtle.left() 函数绘制一个四瓣花图形,效果如下图所示。

参考代码:

import turtle as t for i in range(4): t.left(90) t.circle(100,180) 1234

30、编写程序,实现将列表
ls = [23,45,78,87,11,67,89,13,243,56,67,311,431,111,141] 中的素数去除,并输出去除素数后列表 ls 的元素个数。
参考代码:

def is_prime(n): for i in range(2,n): if n % i == 0: return False return True ls = [23,45,78,87,11,67,89,13,243,56,67,311,431,111,141] for i in ls: if is_prime(i)== True: ls.remove(i) print(ls) 1234567891011

1求1000以内的完数。

for i in range(1001): if i==0: continue s = 0 for j in range(i): if j==0: continue if i%j==0: s=s+j if s==i: print('{} its factors are '.format(i),end='') for j in range(i): if j == 0: continue if i % j == 0: print(j,end=' ') print('n') **2.求水仙花。** for i in range(100, 1000): s = 0 a = i // 100 b = i //10%10 c = i %10 s = a**3+b**3+c**3 if s == i: print("{}是水仙花数".format(i))

1234567891011121314151617181920212223

3统计文档中英文单词数。

import re def count_words(file_path): with open(file_path) as file: text = file.read() words = re.findall(r'[a-zA-Z]+', text) count = len(words) return count print(count_words('hamlet.txt')) 123456789

4绘制五角星。、

import turtle as t t.pencolor('red') t.fillcolor('red') t.begin_fill() for i in range(5): t.fd(200) t.rt(144) t.end_fill() **5输出所有范围内的所有素数。** lower = int(input()) upper = int(input()) s = [] for i in range(lower,upper+1): if i>1: for j in range(2,int(i+1//2)):#int(pow(i+1,0.5)) if (i%j==0): break else: s.append(i) print(s)

123456789101112131415161718192021222324252627

6判断今天是今年的第几天。

year = int(input()) month = int(input()) day = int(input()) day_month = [31,28,31,30,31,30,31,31,30,31,30,31] if year%400 ==0 or year%4 == 0 and year%100 != 0: day_month[1]=29 if month == 1: print(day) else: print(sum(day_month[:month-1])+day) 1234567891011121314

7查找斐波那契数列中第n个数

n = eval(input()) a,b,i= 1,1,1 while i < n: a,b = b,a+b i += 1 print(a) 12345678

8判断字符串是否没有重复字符。

str=input() results = [] new_results = [] for i in str: results.append(i) for i in str: if i not in new_results: new_results.append(i) if results==new_results: print("没有") else: print("有") 9约瑟夫环问题。 n=eval(input("")) k=eval(input("")) if k==1:print('survive:',n) else:p=0people=list(range(1,n+1))while True:if len(people)==1:breakp=(p+(k-1))%len(people)del people[p]print(people[0])

1234567891011121314151617181920212223242526

10生成数字字符串。

a = input() print(''.join([s for s in a if s.isdigit()])) 12

11字符包含。

a = 'oAaAsmr3iddy4bgsb7Dlsf9eAF' search = input() u = set(a) u.update(list(search)) print( len(set(a)) == len(u)) 1234567

12统计高频词。

s = input() l = ([(x,s.count(x)) for x in set(s)]) l.sort(key = lambda k:k[1],reverse=True) print('{}:{}'.format(l[0][0],l[0][1])) 1234

13删除素数。

ls = [23,45,78,87,11,67,89,13,243,56,67,311,431,111,141] def is_prime(n): for i in range(2,n): if n % i == 0: return False return True for i in range(4): for i in ls: if is_prime(i) == True: ls.remove(i) print(ls) 12345678910111213

14计算字符串中所有数字序列的和。

import re string=input("") nums = re.compile(r'd+') mylist = nums.findall(string) my_sum = 0 for num in mylist: my_sum += int(num) print(my_sum) 12345678

15寻找n位黑洞数。

from functools import reduce n=int(input()) if n==4: for i in range(1000,10000): a=[int(c) for c in str(i)] a.sort() #a变为正序 s1 = reduce(lambda x, y: 10 * x + y, a[::-1]) #将它的逆序切片用reduce函数作乘10+y得intmax s2 = reduce(lambda x, y: 10 * x + y, a) #将它本身(正序序列)用reduce函数作乘10+y得intmin if(s1-s2==i): print(i) if n==3: for i in range(100,1000): a=[int(c) for c in str(i)] a.sort() #a变为正序 s1 = reduce(lambda x, y: 10 * x + y, a[::-1]) #将它的逆序切片用reduce函数作乘10+y得intmax s2 = reduce(lambda x, y: 10 * x + y, a) #将它本身(正序序列)用reduce函数作乘10+y得intmin if(s1-s2==i): print(i)

12345678910111213141516171819

16删除列表中重复元素。

l=[] for i in range(7): l.append(eval(input())) def duplicate(lists): l=[ ] for i in lists: if i not in l: l.append(i) return l print(duplicate(l)) 1234567891011

相关知识

解码配送距离:Java编程中的物流里程挑战与解决方案
机器学习=编程?NO!
为爱编程,专属于程序员的情人节赠书活动
台湾地区Windows操作系统盗版现象对编程环境的影响及解决方案探讨
挑战编程 程序设计竞赛训练手册
AI必读10本经典
“恒为杯”江南大学第三届Python编程竞赛举办
Java十大经典案例源码解析与实战应用
遗传编程技术是什么
编程猫社区

网址: 经典编程挑战与解决方案 https://www.huajiangbk.com/newsview1179398.html

所属分类:花卉
上一篇: 葡萄怎么保存
下一篇: python的datetime模

推荐分享